zoukankan      html  css  js  c++  java
  • 数塔

    牛吃草

    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;
    }
    
    
  • 相关阅读:
    轮播图2
    点击按钮切换轮播图
    轮播图
    2016.5.5_十进制转二进制【ABAP】
    2016.4.26_longtext长文本【ABAP】
    2016.4.26_动态内表【ABAP】
    2016.4.26_下载abap代码【ABAP】
    2016.4.15_debug小技巧【ABAP】
    2016.4.1_js向controller传数据【笔记】
    2016.3.21_TABLE CONTROL【ABAP】
  • 原文地址:https://www.cnblogs.com/lingr7/p/10523451.html
Copyright © 2011-2022 走看看