HDU 数塔DP思维设计

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084

已经告诉你了,这是个DP的题目,你能AC?

大神请绕道---不喜勿喷

请自己推状态方程

第一种:

//数塔---由上往下

/*#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<algorithm>

#include<iomanip>

using namespace std;                         //核心思想:问题所求值,在第i层第j个取到最值 

int c,n,dp[105][105];

int main()

{

    while(scanf("%d",&c)!=EOF)

    {

        while(c--)

        {

        scanf("%d",&n);

        for(int i=0;i<n;i++)

            for(int j=0;j<=i;j++)

                scanf("%d",&dp[i][j]);

        for(int i=1;i<=n-1;i++)

            for(int j=0;j<=i;j++)           //这种数据排列由上往下的话  往往需要考虑边界问题

                if(j==0)

                    dp[i][j]+=dp[i-1][j];

                else if(j==i)

                    dp[i][j]+=dp[i-1][j-1];

                else

                    dp[i][j]+=max(dp[i-1][j],dp[i-1][j-1]);

        sort(dp[n-1],dp[n-1]+n);

  /*      for(int i=0;i<n;i++)

            printf("%d ",dp[n-1][i]);

        printf("\n");  */

/*        printf("%d\n",dp[n-1][n-1]);

        }

    }

    return 0;

}*/

//由下往上            

/*#include<stdio.h>

int main()

{

    int c,n,dp[105][105];

    while(scanf("%d",&c)!=EOF)      //核心思想:每一次向下求最大和,都取决于下一层、下一层、、、等等---最后逆向思维 反向考虑  

    {

        while(c--)

        {

            scanf("%d",&n);

            for(int i=0;i<n;i++)

                for(int j=0;j<=i;j++)

                scanf("%d",&dp[i][j]);

            for(int i=n-2;i>=0;i--)

                for(int j=0;j<=i;j++)              //由下往上的话  就不需要考虑边界了 

                    if(dp[i+1][j]>dp[i+1][j+1])

                        dp[i][j]+=dp[i+1][j];

                    else

                        dp[i][j]+=dp[i+1][j+1];

            printf("%d\n",dp[0][0]);

        }

    }

    return 0;

}*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值