数塔

牛吃草

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\n",dp[1][1]); 
	return 0;
}

posted @ 2019-03-13 15:26  lingr7  阅读(360)  评论(0编辑  收藏  举报