您的位置:首页 > 其它

luogu P1216 [UASCO1.5]数字三角形 Number Triangles

2017-12-05 11:49 295 查看
题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

******7

*****3*8

****8*1*0

-* 2*7*4*4*

*4*5*2*6*5

在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大

输入输出格式

输入格式:

第一个行包含 R(1<= R<=1000) ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

所有的被供应的整数是非负的且不大于100。

输出格式:

单独的一行,包含那个可能得到的最大的和。

输入输出样例

输入样例#1: 复制

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

输出样例#1: 复制

30

说明

题目翻译来自NOCOW。

USACO Training Section 1.5

又是一道动态规划题。

这里我从下向上推,倒数第二行的任意元素可以取左下或者右下角的元素,然后我们要使结果最大化,通过比较左下角元素和右下角元素,我们可以得到通过倒数第二行任意元素的唯一最优路径,而此时我们可以将以推算出来的路径之和给最上面的元素,那么问题又转化成了最初的样子,以此推论,我们可以找到整个金字塔的最优路径。

下面贴上代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int dp[1005][1005];
int main(void)
{
int r;
scanf("%d",&r);
for(int i=1;i<=r;i++)
for(int j=1;j<=i;j++)
scanf("%d",&dp[i][j]);
for(int i=r-1;i>=1;i--)
for(int j=1;j<=i;j++)
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+dp[i][j];
printf("%d\n",dp[1][1]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: