其他分享
首页 > 其他分享> > 数塔

数塔

作者:互联网

牛吃草

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;
}

标签:数塔,int,品质,样例,Alice,maxn,牧草
来源: https://www.cnblogs.com/lingr7/p/10523451.html