SCU 1114 数字三角

来源:互联网 发布:我的世界淘宝服务器 编辑:程序博客网 时间:2024/04/29 17:09
C - 数字三角
Time Limit:0MS    Memory Limit:0KB     64bit IO Format:%lld & %llu
Submit Status Practice SCU 1114

Description

下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。

7

3  8

8  1  0

2  7  4  4

1.  每一步可沿左斜线向下或右斜线向下走;

2.  1<=三角形行数<=100

3.  三角形中的数字为整数 0,1,……,99。

4.  如果有多种情况结果都最大,任意输出一种即可。

 

输入:

第一行一个整数N,代表三角形的行数。

接下来N行,描述了一个数字三角。

 

输出:

    第一行一个整数,代表路径所经过底数字总和。

    第二行N个数,代表所经过的数字。

 

样例:

输入:

4
7
3 8
8 1 0
2 7 4 4

输出:

25
7 3 8 7


找到了之前的一道DP题目,入门级别简单线性DP,当时自己纯手打的。温习一下。


#include <stdio.h>#include <algorithm>#define N 105using namespace std;int a[N][N];int n;int sum[N][N];int ans[N];void dp(){        sum[1][1]=a[1][1];        for(int i=2;i<=n;i++)        for(int j=1;j<=i;j++)        {                if(j==1)                        sum[i][j]=sum[i-1][j]+a[i][j];                else if(j==i)                        sum[i][j]=sum[i-1][j-1]+a[i][j];                else                        sum[i][j]=max(sum[i-1][j-1],sum[i-1][j])+a[i][j];        }}int main(){   while(scanf("%d",&n)>0)   {        for(int i=1;i<=n;i++)                for(int j=1;j<=i;j++)                        scanf("%d",&a[i][j]);        dp();        int pos;        int max=sum[n][1];        for(int i=n;i>=1;i--)        {                if(sum[n][i]>max)                {                        max=sum[n][i];                        pos=i;                }        }        ans[n]=a[n][pos];        for(int i=n-1;i>=1;i--)        {                if(pos==1)                {                        ans[i]=a[i][1];                }                else if(pos==i)                {                        ans[i]=a[i][i-1];                        pos=i-1;                }                else if(sum[i][pos]>sum[i][pos-1])                {                        ans[i]=a[i][pos];                }                else if(sum[i][pos]<sum[i][pos-1])                {                        ans[i]=a[i][pos-1];                        pos=pos-1;                }        }        printf("%d\n",max);        printf("%d",ans[1]);        for(int i=2;i<=n;i++)                printf(" %d",ans[i]);        printf("\n");   }   return 0;}


0 0