USACO Section1.5 Number Triangles 解题报告
numtri解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
有一个数字的金字塔,形状如下
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要从顶端开始走,每次只能向左下或者右下走,求所经过的数字之和最大值。
【数据范围】
1<=R<=1000
0<=每个数<=100
【输入样例】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【输出样例】
30
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
DP。
设num[i][j]为i行j列的数,d[i][j]是从1行1列走到i行j列的当前最优解。
d[1][1]=num[1][1];
d[i][j]=0; // i>1 or j>1
从1行1列走到R行某列的最大值,可以直接递归出来,状态转移方程如下:
当i==1,j>=2时,d[i][j]=d[i-1][j]+num[i][j];
当i>=2,j>=2时,d[i][j]=max{d[i-1][j]+num[i][j],d[i-1][j-1]+num[i][j]};
但本题,递归有边界情况,比较麻烦,递推更方便,状态转移方程如下:
当i>=2,2<=j<R时
d[i+1][j]=max{d[i+1][j],d[i][j]+num[i+1][j]};
d[i+1][j+1]=max{d[i+1][j+1],d[i][j]+num[i+1][j+1]};
最终,只要扫过d[R][1~R]取得最大值输出即可。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
一遍AC。
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
ID: icedrea1
PROB: numtri
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; int R;
int num[][],d[][]; void change(int &r,int x) { if(x>r) r=x; } int main()
{
ifstream in("numtri.in");
ofstream out("numtri.out"); in>>R;
for(int i=;i<=R;++i)
for(int j=;j<=i;++j) in>>num[i][j]; d[][]=num[][];
for(int i=;i<R;++i)
for(int j=;j<=i;++j)
{
change(d[i+][j],d[i][j]+num[i+][j]);
change(d[i+][j+],d[i][j]+num[i+][j+]);
} int maxSum=;
for(int j=;j<=R;++j) change(maxSum,d[R][j]);
out<<maxSum<<endl; in.close();
out.close();
return ;
}
USACO Section1.5 Number Triangles 解题报告的更多相关文章
- USACO Section1.5 Prime Palindromes 解题报告
pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.5 Superprime Rib 解题报告
sprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.4 Arithmetic Progressions 解题报告
ariprog解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
- USACO Section1.3 Combination Lock 解题报告
combo解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.3 Prime Cryptarithm 解题报告
crypt1解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.3 Barn Repair 解题报告
barn1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.3 Mixing Milk 解题报告
milk解题报告 —— icedream61 博客园(转载请注明出处)----------------------------------------------------------------- ...
- USACO Section1.2 Palindromic Squares 解题报告
palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- USACO Section1.2 Dual Palindromes 解题报告
dualpal解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
随机推荐
- 5 - 文件I/O操作
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的 写文件 #打开data.txt,创建一个实例f f = open('data.txt','w') #向文件中写内容 f. ...
- EF写in
qualityStatisticsInfoSql.Where(t => successStateArray.Contains(t.UploadReportFlag)); 如果写成 quality ...
- 计算多项式Poj(1996)
题目链接:http://poj.org/problem?id=1996 思路: 刚开始打了个二维表,调了一个小时,爆内存了. #include <stdio.h> #include < ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- 遗忘的html标签
<span>x</span><sup>2</sup><span>+y=10</span> <br> <span ...
- Pop–实现任意iOS对象的任意属性的动态变化
简介 Pop 是一个可扩展的动画引擎,可用于实现任意iOS对象的任意属性的动态变化,支持一般动画,弹性动画和渐变动画三种类型. 项目主页: pop 最新示例: 点击下载 注意: 官方代码中,并不包含实 ...
- POJ2154 Color(Polya定理)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11654 Accepted: 3756 Description Bead ...
- linux环境下nginx配置
1.反向代理配置 # nginx/conf/nginx.conf
- js对象动态添加属性,方法
1. 动态添加属性,方法 var object = new Object(); object.name = "name"; object.age = 19; >>> ...
- Linux文件系统与目录结构
在Linux系统中,目录被组织成一个:单根倒置树结构,文件系统从根目录开始,用/来表示.文件名称区分大小写( 大小写敏感还需要看具体的文件系统格式 ),以.开头的为隐藏文件,路径用/来进行分割(win ...