数字三角形 DP入门

来源:互联网 发布:排班表时间表软件 编辑:程序博客网 时间:2024/05/14 11:52

http://acm.sdut.edu.cn/sdutoj/show

数字三角形问题

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
  
对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。

输入

输入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0..99之间。

输出

输出数据只有一个整数,表示计算出的最大值。

示例输入

573 88 1 02 7 4 44 5 2 6 5

示例输出

30

提示

 

来源

 

示例程序

做的第一道DP题,算是比较经典的DP入门题了,每个点只能向下或者向斜下移动,所以可以得到动态转移方程为dp[i-1][j]=a[i][j]+max(dp[i][j],dp[i][j+1])

转换成代码如下:

view plaincopyprint如果您复制代码时出现行号,请点击左边的“view plain”后再复制
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     int n, a[100+5][100+5], dp[100+5][100+5];  
  8.     while(~scanf("%d", &n))  
  9.     {  
  10.         memset(dp,0,sizeof(dp));  
  11.         for(int i=1;i<=n;i++)  
  12.             for(int j=1;j<=i;j++)  
  13.             scanf("%d", &a[i][j]);  
  14.         for(int j=1;j<=n;j++)  
  15.             dp[n][j]=a[n][j];  
  16.         for(int i=n;i>1;i--)  //注意这里i为n->1,目的是保证第i-1次的值是由第i次的值推出来的
  17.             for(int j=1;j<i;j++)  
  18.             dp[i-1][j]=a[i-1][j]+max(dp[i][j],dp[i][j+1]);  
  19.         printf("%d\n", dp[1][1]);  
  20.     }  
  21.     return 0;  
  22. }  
这里使用了两个数组,其实也可以用一个数组代替以降低空间的复杂度,代码如下

view plaincopyprint如果您复制代码时出现行号,请点击左边的“view plain”后再复制
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     int n, dp[100+5][100+5];  
  8.     while(~scanf("%d", &n))  
  9.     {  
  10.         for(int i=1;i<=n;i++)  
  11.             for(int j=1;j<=i;j++)  
  12.             scanf("%d", &dp[i][j]);  
  13.         for(int i=n;i>1;i--)  
  14.             for(int j=1;j<i;j++)  
  15.             dp[i-1][j]+=max(dp[i][j],dp[i][j+1]);  
  16.         printf("%d\n", dp[1][1]);  
  17.     }  
  18.     return 0;  
  19. }  

  • 0 0
    原创粉丝点击