题目链接
Description
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
记忆化数组:
#include<iostream>
#include<cstdio>
using namespace std;
int n,arr[105][105],ans[105][105];
int Maxsum(int r,int c){
if(ans[r][c])
return ans[r][c];
if(r == n)
return ans[r][c] = arr[r][c];
int x = Maxsum(r + 1,c);
int y = Maxsum(r + 1,c + 1);
return ans[r][c] = max(x,y) + arr[r][c];
}
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= i;j++)
scanf("%d",&arr[i][j]);
printf("%d\n",Maxsum(1,1));
return 0;
}
动态规划代码:(从下往上)[“人人为我”类型]
#include<iostream>
#include<cstdio>
using namespace std;
int n,arr[105][105],dp[105][105];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= i;j++)
scanf("%d",&arr[i][j]);
for(int i = 1;i <= n;i++)
dp[n][i] = arr[n][i];
for(int i = n - 1;i >= 1;i--)
for(int j = 1;j <= i;j++)
dp[i][j] = max(dp[i + 1][j],dp[i + 1][j + 1]) + arr[i][j];
printf("%d\n",dp[1][1]);
return 0;
}
动态规划代码:(从上往下)[“我为人人”类型]
注意:最后一定要扫一遍最后一行,找到最大值
#include<iostream>
#include<cstdio>
using namespace std;
int n,mx,arr[105][105],dp[105][105];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= i;j++)
scanf("%d",&arr[i][j]);
dp[1][1] = arr[1][1];
for(int i = 2;i <= n;i++)
for(int j = 1;j <= i;j++){
if(j > 1)
dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - 1]) + arr[i][j];
else
dp[i][j] = dp[i - 1][j] + arr[i][j];
}
for(int i = 1;i <= n;i++)
mx = max(mx,dp[n][i]);
printf("%d\n",mx);
return 0;
}
滚动数组优化
#include<iostream>
#include<cstdio>
using namespace std;
int n,arr[105][105],dp[105];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= i;j++)
scanf("%d",&arr[i][j]);
for(int i = 1;i <= n;i++)
dp[i] = arr[n][i];
for(int i = n - 1;i >= 1;i--)
for(int j = 1;j <= i;j++)
dp[j] = max(dp[j],dp[j + 1]) + arr[i][j];
printf("%d\n",dp[1]);
return 0;
}