小乐乐想下山HLG

来源:互联网 发布:淘宝怎么扶持新店 编辑:程序博客网 时间:2024/05/01 02:00


小乐乐要下山

Time Limit: 1000 MS

Memory Limit: 32768 K

 

Total Submit: 134(69 users)

Total Accepted: 79(66 users)

Rating: 

Special Judge: No

 

Description

上学的路总是那么艰辛,在小乐乐辛苦的出了家门之后,她才想起自己的家已经搬到山上了(睡的真迷糊)。下山的路同样十分艰难,不同的地方通行的难易程度也不同。如图所示,小乐乐现在在山顶上,她面前有两条路,每条路通往一个地点,每个地点有一个值,表示这个通行的难易程度。最底层的地点就是山脚了。大家知道,小乐乐好懒好懒的,她想知道怎么下山最省力?

Input

第一行一个整数n(1<n<500)
随后n行,第i+1行有i个数字
表示山上的路况

Output

输出从山顶到山脚最省力的路。(保证答案唯一)

Sample Input

3
1
2 5
5 6 3

Sample Output

1 2 5

 

 

#include<stdio.h>

#include<string.h>

int dp[1010][1010];

int a[1010][1010];

int main()

{

    void qwer(int ,int ,int );

    int n,i,j;

    int min;

    while(~scanf("%d",&n))

    {

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

        for(j=1;j<=i;j++)

        scanf("%d",&a[i][j]);//按照下三角形式输入.

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

        for(j=1;j<=i;j++)

        dp[i][j]=a[i][j];//将a复制给dp.

        for(i=n;i>=1;i--)

        {

            for(j=1;j<i;j++)

            {

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

                {

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

                }

                else

                {

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

                }

            }

        }//同志们可以思考一下.最终获得的dp[1][1];是什么东西.

        //按照例题输入来看 这一步骤完成后dp变成了

        //1

        //7 8

        //5 6 3

        //改变了dp的值之后.进行下一步.

        //假如是

        //1

        //7 7

        //5 6 3

        //1的走向是右边的7.

        printf("%d ",a[1][1]);

        qwer(2,1,n);//这个函数用来比较最优解并且输出的.

    }

    return 0;

}

void qwer(int i,int j,int n)//从(2,1)开始研究最优解.n=3用来控制啥时候换行的.

{

    if(i==n+1) return ;//当i=n的时候还是会进行下一次比较.当比较完成后 i会+1.就变成了i==n+1.此时宣布比较完毕.

    if(dp[i][j]<dp[i][j+1])//(2,1)(2,2)两个dp的值进行比较.输出小的位子上最开始输入的值,也就是a(小的坐标).(第一步.

    {

        if(i<n) printf("%d ",a[i][j]);

        else printf("%d\n",a[i][j]);

        qwer(i+1,j,n);//至于为什么i+1,j不+1,而下一种可能就+1,如果你考虑懂了,说明你真的懂了.(可以理解为向小的dp值方向走.

    }

    else//(2,1)(2,2)两个dp的值进行比较.输出小的位子上最开始输入的值,也就是a(小的坐标).(第一步.

    {

        if(i<n)printf("%d ",a[i][j+1]);

        else printf("%d\n",a[i][j+1]);

        qwer(i+1,j+1,n);

    }

}

 

0 0
原创粉丝点击