数塔
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 20604 Accepted Submission(s): 12369
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
30
//title:2084
//问题分类:数塔-动态规划
#include<stdio.h>
#include<string.h>
int dp[110][110];
int list[110][110];
int max(int a,int b){
return a<b?b:a;
}
int main(){
freopen("in.txt","r",stdin);
int zu;
while(scanf("%d",&zu)!=EOF){
while(zu--){
int h;
scanf("%d",&h);
memset(dp,0,sizeof(dp));
memset(list,0,sizeof(list));
for(int i=0;i<h;i++){
for(int j=0;j<=i;j++){
scanf("%d",&list[i][j]);
if(i==h-1){
dp[i][j]=list[i][j];
}
}
}
for(int i=h-2;i>=0;i--){
for(int j=0;j<=i;j++){
dp[i][j]=max(list[i][j]+dp[i+1][j],list[i][j]+dp[i+1][j+1]);
}
}
printf("%d\n",dp[0][0]);
}
}
return 0;
}