时间:2016-05-09 19:25:06 星期一
题目编号:[2016-05-09][51nod][1002 数塔取数问题]
题目大意:
- 一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。
分析:动态规划
- dp[i][j] 表示到 dp[i][j]时的最大值
- dp[i][j] = max(dp[i-1][j],dp[i - 1][j - 1]) + a[i][j];
- ans = max(dp[n - 1][i])
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 500 + 10;int dp[maxn][maxn],a[maxn][maxn];int main(){ int n; scanf("%d",&n); memset(dp,0,sizeof(dp)); for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j <= i ; ++j){ scanf("%d",&a[i][j]); } } dp[0][0] = a[0][0]; int ans = 0; for(int i = 1 ; i < n ; ++i){ dp[i][0] = dp[i - 1][0] + a[i][0]; ans = max(ans , dp[i][0]); for(int j = 1 ; j <= i ; ++j){ dp[i][j] = max(dp[i - 1][j] + a[i][j] , dp[i - 1][j - 1] + a[i][j]); ans = max(dp[i][j] , ans); } } printf("%d\n",ans); return 0;}