1002 数塔取数问题
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。58 43 6 97 2 9 5例子中的最优方案是:5 + 8 + 6 + 9 = 28Input第1行:N,N为数塔的高度。(2 <= N <= 500) 第2 - N + 1行:每行包括1层数塔的数字,第2行1个数,第3行2个数......第k+1行k个数。数与数之间用空格分隔(0 <= A[i] <= 10^5) 。Output输出最大值Input示例4 5 8 4 3 6 9 7 2 9 5Output示例28
刷了一晚上水题刷得有点膨胀??
首先初始化最底层,从底向上做dp,则可得dp方程为:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+map[i][j];
附AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int map[510][510]; 5 int dp[501][510]; 6 7 int main(){ 8 int t; 9 cin>>t; 10 for(int i=0;i<t;i++){ 11 for(int j=0;j<=i;j++){ 12 cin>>map[i][j]; 13 } 14 } 15 for(int i=0;i<t;i++){ 16 dp[t-1][i]=map[t-1][i]; 17 } 18 for(int i=t-1;i>=0;i--){ 19 for(int j=0;j<=i;j++){ 20 dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+map[i][j]; 21 } 22 } 23 cout<<dp[0][0]<<endl; 24 return 0; 25 }
当然 这题直接贪心会更快:
1 #include <stdio.h> 2 3 using namespace std; 4 5 #define MAXNUM 125250 6 int tower[501][501]={0}; 7 int S[501][501]={0}; 8 int main(int argc,char** argv) 9 { 10 int n;scanf("%d",&n); 11 12 for(int i=0;i<n;i++) 13 for(int j=0;j<=i;j++){ 14 scanf("%d",&tower[i-j][j]); 15 16 } 17 18 int i,j,temp=0; 19 for(i=0;i<n;i++) 20 for(j=0;j<n;j++){ 21 22 if(i>0) 23 temp=S[i-1][j]; 24 if(j>0) 25 if(temp<S[i][j-1]) 26 temp=S[i][j-1]; 27 28 S[i][j]=tower[i][j]+temp; 29 30 } 31 32 printf("%d",S[i-1][j-1]); 33 34 return 0; 35 }