hdu 2084 数塔

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=2084

这题如果从上往下递推就要分两种情况写递推式:

if(i-j>=1)

dp[i][j]=max(dp[i-1][j]+dp[i-1][j+1])+当前[i][j]的值

else

dp[i][j]=dp[i-1][j-1]+当前[i][j]的值

但是如果倒过来考虑,也就是从底部开始往上递推,那么递推式就是:

dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+当前[i][j]的值

这样写就方便多了。

源代码:

 1 #include <iostream>
 2 #include<stdio.h>
 3 #include<cstring>
 4 using namespace std;
 5 int a[105][105],dp[105][105];
 6 int main()
 7 {
 8    //freopen("in.txt","r",stdin);
 9   // freopen("out.txt","w",stdout);
10    int cas;
11    scanf("%d",&cas);
12    while(cas--){
13      int n;
14      memset(dp,0,sizeof(dp));
15      scanf("%d",&n);
16      for(int i=1;i<=n;i++)
17        for(int j=1;j<=i;j++){
18          scanf("%d",&a[i][j]);
19        }
20      for(int i=1;i<=n;i++)
21        dp[n][i]=a[n][i];
22      for(int i=n-1;i>=1;i--)
23        for(int j=1;j<=i;j++){
24          dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
25        }
26      printf("%d\n",dp[1][1]);
27    }
28     return 0;
29 }

 

posted @ 2013-08-12 12:13  小の泽  阅读(163)  评论(0编辑  收藏  举报