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 }