HDU 2084 数塔 DP
http://acm.hdu.edu.cn/showproblem.php?pid=2084
题目:
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
水题。
显然动态转移方程为:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1]);dp[i][j]+=a[i][j];
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=102; int a[MAXN][MAXN]; int dp[MAXN][MAXN]; int main() { int T; scanf("%d",&T); while(T--) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); int n; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) dp[n][i]=a[n][i]; for(int i=n-1;i>=0;i--) { for(int j=1;j<=i;j++) { dp[i][j]=max(dp[i+1][j],dp[i+1][j+1]); dp[i][j]+=a[i][j]; } } printf("%d\n",dp[1][1]); } return 0; }
新 blog : www.hrwhisper.me