【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;

 

posted on 2012-07-21 12:57  Yuna_  阅读(64)  评论(0)    收藏  举报