标题:数字三角形问题,求走过路径的数值最大的答案。
只看楼主
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 9楼 花脸
明白了~那个输出图原型是一个金字塔~不过打印数据时移位了~那题答案是30~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-12 17:53
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
以下是引用九转星河在2017-3-12 17:53:03的发言:

明白了~那个输出图原型是一个金字塔~不过打印数据时移位了~那题答案是30~

就算是个金字塔也不等于30呀,7+8+1+7+5=28
2017-03-12 18:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 12楼 ehszt
7+3+8+7+5=30~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-12 18:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
试试这个~~好像涉及到队列~~~~~~~~~

程序代码:
#include<stdio.h>

void creat(int a[][25],int n);
void print(int a[][25],int n);
int get_max(int b[],int n);

int fun(int a[][25],int n);

int main()
{
    int a[25][25]={0};

    int n=0;

    scanf("%d",&n);

    creat(a,n);

    print(a,n);

    printf("\n%d\n",fun(a,n));

    return 0;
}

void creat(int a[][25],int n)
{
    int i=0;
    int j=0;

    for (i=0;i<n;++i)
        for (j=0;j<=i;++j)
            scanf("%d",&a[i][j]);
}

void print(int a[][25],int n)
{
    int i=0;
    int j=0;

    puts("");

    for (i=0;i<n;++i)
    {
        for (j=0;j<=i;++j)
            printf("%-3d",a[i][j]);

        puts("");
    }
}

int fun(int a[][25],int n)
{
    int sum=0;

    int b[25]={0};
    int c[25]={0};

    int i=0;
    int j=0;
    int k=0;

    for (i=0;i<n;++i)
    {
        for (j=0;j<=i;++j)
            if (j==0)
                c[j]=b[j]+a[i][j];
            else if (j==i)
                c[j]=b[j-1]+a[i][j];
            else
                c[j]=(b[j-1]>b[j]?b[j-1]:b[j])+a[i][j];

        for (k=0;k<=i;++k)
            b[k]=c[k];
    }

    sum=get_max(b,n);

    return sum;
}

int get_max(int b[],int n)
{
    int i=0;
    int max=b[0];

    for (i=1;i<n;++i)
        if (b[i]>max)
            max=b[i];

    return max;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-12 21:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
这题感觉还可以化简~有兴趣的可以去尝试一下~精力问题我就这样先了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-12 22:04
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 15楼 九转星河
看懂了,下一级和上一级求和选上一级较大的。最后一层有多少列就有多少种不同的和值。
你很厉害!
2017-03-12 22:44
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:4 
这是一道DP题,我简单点说。

考虑从下往上
第五步有5种可能,分别是(4 5 2 6 5)
第四步有4种可能,分别是(2+5=7 7+5=12 4+6=10 4+6=10)
第三步有3种可能,分别是(8+12=20 1+12=13 0+10=10)
第二步有2种可能,分别是(3+20=23 8+13=21)
第一步有1种可能,7+23=30

程序代码:
#include <stdio.h>

#define N  5

int max(int a, int b) { return a > b ? a : b; }

int main()
{
    int n, s[N][N], val[N + 1] = {0};

    scanf("%d", &n);
    for (int i = 0; i < n; ++i) for (int j = 0; j <= i; ++j) scanf("%d", &s[i][j]);

    for (int i = n - 1; i >= 0; --i)
    {
        for (int j = 0; j <= i; ++j)
        {
            val[j] = s[i][j] + max(val[j], val[j + 1]);
        }
    }
    printf("%d\n", val[0]);

    return 0;
}


多说一点一般过程。

正向考虑,第一步选择7,7问3和8选你俩谁结果最大?,3和8又分别去问(8 1)和(1 0)...这样一层层问下去。
第5层不用问,他们知道答案,并把最大值告诉第4层,然后依次往上回答,最后3告诉7选我结果为30最大。于是7选择3作为下一步...

这样只考虑局部优先解,最终得到全局优先解,就是所谓的动态规划。


[此贴子已经被作者于2017-3-13 10:14编辑过]

收到的鲜花
  • ehszt2017-03-13 12:04 送鲜花  10朵   附言:老大写的简单明了!


[fly]存在即是合理[/fly]
2017-03-13 09:55
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 17楼 azzbcc
恩 好的 谢了 这题使用++i --i  ++j --j 和i++ i-- 等这效果一样吗?
2017-03-13 20:57
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 14楼 九转星河
恩好的 谢了 我研究研究。
2017-03-13 21:02
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:4 
以下是引用花脸在2017-3-13 20:57:48的发言:

恩 好的 谢了 这题使用++i --i  ++j --j 和i++ i-- 等这效果一样吗?


一样

早知做人那么辛苦!  当初不应该下凡
2017-03-14 08:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474989-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022663 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved