【HDU】2084 数塔
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
去年刚接触DP问题的时候最有成就感的就是这题了,因为只要了解过一点DP的思想,这道题目的思路也就马上出来了。

如图:
我的做法是至下而上,找到动态转移方程:DP[i][j]=max{DP[i+1][j]+map[i+1][j], DP[i+1][j+1]}
显然当塔底每个格子的最大值确定后,上一层每个格子的DP[i][j]的值也能确定下来。
如蓝色格子的DP肯定是[n][1]和[n][2]两者之间最大值,红色的DP是[n][2]和[n][3]两者之间的最大值,因为底层每个格子的DP值已经确定,那么第n-1层的也能确定,即蓝色和红色的就能确定。
又因为蓝色、红色确定下来,那么绿色的也就相应确定下来了。
……
最后DP[1][1]的值也唯一确定下来了,并且是所有路径中的最大值。
现在想想,可能难点就是想到自下而上的动归? 那个时候貌似没考虑太多就直接有思路了……
代码也是很简单的:
View Code
1 scanf("%d",&n); 2 memset(dp,0,sizeof(dp)); 3 for(i=1; i<=n; ++i) 4 for(j=1; j<=i; ++j) { 5 scanf("%d",&map[i][j]); 6 dp[i][j]=map[i][j]; 7 } 8 for(i=n-1; i; --i){ 9 for(j=1; j<=n; ++j){ 10 t = dp[i+1][j] > dp[i+1][j+1] ? dp[i+1][j] : dp[i+1][j+1]; 11 dp[i][j]+= t; 12 } 13 } 14 15 cout<<dp[1][1]<<endl;

浙公网安备 33010602011771号