• 数塔


    牛吃草

    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;
    }
    
    
  • 相关阅读:
    /etc/init.d/functions详解[转]
    把linux可执行程序做成一个服务[转]
    Centos下Subversion 服务器安装配置(转)
    经典面试编程题atoi()实现
    asp.net mvc 模型绑定 从简单类型到泛型集合
    C# 编译器 csc 简单用法
    js 操作文本框中光标位置
    简洁的lambda表达式
    iphone safari不支持position fixed的解决办法
    List排序函数Sort
  • 原文地址:https://www.cnblogs.com/lingr7/p/10523451.html
Copyright © 2020-2023  润新知