zoukankan      html  css  js  c++  java
  • 数字三角形/数塔问题(DP入门题)

    有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。

    样例输入:

    5

    13

    11 8

    12 7 26

    6 14 15 8

    12 7 13 24 11

    样例输出:

    86(13->8->26->15->24)

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define maxn 105
    using namespace std;
    int n;
    int a[maxn][maxn]; 
    int dp[maxn][maxn];   //自底向上,记录从点(i,j)出发到数塔底层的路径最大和 
    int main()
    {
    	int i,j;
    	scanf("%d",&n);
    	for(i=0;i<n;i++)
    		for(j=0;j<=i;j++)
    			scanf("%d",&a[i][j]);
    	memset(dp,0,sizeof(dp));
    	for(i=0;i<n;i++)  //填数塔最底层
    		dp[n-1][i]=a[n-1][i];
    	for(i=n-2;i>=0;i--)   //更新除数塔最底层外的各个点的路径最大和 
    		for(j=0;j<=i;j++)
    			dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
    	printf("%d
    ",dp[0][0]);
    	return 0;
    }
    

    注释:最简单的动态规划题(DP)还是没想出来怎么做,
    这个题只要求要最大的数,所有需要自低向上计算每一个DP[i][j]的最大值一直到DP[0][0]就是最后的答案

    状态转移方程:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/saber114567/p/9350134.html
Copyright © 2011-2022 走看看