《SDUT1730 数字三角形问题》2关于数字三角形,求最小值最大值的N次纠结。

题目是这样的,给一个数字三角形,让你求和最大的路径,还有一个题是求和最小的路径,示例数据都是一样的, 所以没有贴那个题的图。

对于一个刚刚熟悉DP的萌新来说,开始拿到这道题是既有点激动又有点懵逼的。

废话不多说,直接上代码了  第一个代码是DP的,用的那个什么规划方程,中间修修改改好多次,终于是做出来了。

其中有这么几个常犯的错误:1、输入的时候,i是从0-n-1,但是j是从0-i+1,我弄成j是从0-n-1了。   2、计算dp的时候,i是从n-2开始的,逐渐递减,到0。3、dp[i][j]=max(dp[i+1][j]+a[i+1][j],dp[i+1][j]+a[i+1][j]),千万不要写成dp[i][j]=max(a[i+1][j],a[i+1][j+1])+dp[i][j],因为你之前一行的dp木有加进来啊啊!4、dp全部赋值为0,并且写在while循环里哦。5、输出的时候加上a[0][0].因为这个算的是之前一行的dp,这一行的a没加。

下面是dp的代码。

/*dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])*/
#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[110][110];

int main()
{
    memset(dp,0,sizeof(dp));
    int n,i,j;
    int a[110][110];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<i+1;j++)
            scanf("%d",&a[i][j]);
    for(i=n-2;i>=0;i--)
        for(j=0;j<i+1;j++)
            dp[i][j]=max(dp[i+1][j]+a[i+1][j],dp[i+1][j+1]+a[i+1][j+1]);
    printf("%d",dp[0][0]+a[0][0]);
    return 0;
}



/***************************************************


Result: Accepted
Take time: 0ms
Take Memory: 196KB
Submit time: 2017-04-14 15:45:24
****************************************************/
然后是作死写dfs的代码,貌似超时了,就没再纠结了。如果能用dfs做的话,等我厉害了,我会再回来用更高效的dfs做出来的。
/*dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])*/
#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[110][110],n;
int dp(int i,int j)
{
    int sum=0;
    if(i==n-1)
        return a[i][j];
    else sum+=max(dp(i+1,j),dp(i+1,j+1))+a[i][j];
    return sum;
}

int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<i+1;j++)
            scanf("%d",&a[i][j]);
    i=0;j=0;
    printf("%d\n",dp(i,j));
    

    return 0;
}



/***************************************************

Result: Time Limit Exceeded
Take time: 1010ms
Take Memory: 0KB
Submit time: 2017-04-14 16:15:46
****************************************************/
好了,就这样吧,一道最简单的dp,被老子做了一个多小时。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值