输入一组数塔,求解怎样使总数和最大
从最底层的各位置dp值开始,不断往上求出每一层各位置的dp值,最后就会得到dp[1][1],即为想要的答案。
递推写法的计算方式是自底向上,即从边界开始,不断向上解决问题,直到解决了目标问题;而使用递归写法的计算方式是自顶向下,即从目标问题开始,将它分解成子问题的组合,直到分解至边界为止。
《算法笔记》P428
代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 1000;
int f[maxn][maxn],dp[maxn][maxn];
int main(){
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
for(int j = 1;j<= i;j++){
scanf("%d",&f[i][j]); //输入数塔,每i行有i个
}
}
//边界
for(int j = 1;j <= n;j++){
dp[n][j] = f[n][j];
}
//从第n-1层不断往上计算出dp[i][j]
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]) + f[i][j];
}
}
printf("%d\n",dp[1][1]);
return 0;
}
/*
5
5
8 3
12 7 16
4 10 11 6
9 5 3 9 4
*/