牛吃草
Alice在山上放牛,发现前边的山坡上有一块优质草场。草场呈三角形分布,共有N行,第i行有i棵牧草,这块草场上的每棵的牧草的品质可以用一个正整数来描述。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Alice牵着牛从三角形的上方的顶点开始,牛吃完一棵牧草之后只可以吃当前的左前方或右前方的一棵。请你帮Alice计算牵着牛从第1行到第N行吃牧草,能吃到牧草的品质之和最大为多少。
数据输入
输入共N+1行。第一行有一个整数N代表三角形的行数,接下来N行,第i行有空格分隔的i-1个整数,表示草场上各棵牧草的品质
1<N≤100
牧草品质的整数均在区间[0,100]
数据输出
输出只有一行,一个整数代表吃到牧草品质之和的最大值
样例1
输入样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例
30
提示
7 -> 3 -> 8 -> 7 -> 5
7+3+8+7+5=30
思路
这是典型的最大和问题。有自顶向下和自底向上两种思路吧。
代码
就是数塔
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int f[maxn][maxn],dp[maxn][maxn];
int main(void){
int n;
scanf("%d",&n);
for(int i=1;i<=n; i++){
for(int j=1; j<=i; j++){
scanf("%d",&f[i][j]); //输入数塔
}
}
//边界
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
",dp[1][1]);
return 0;
}