比赛 刷题ing 评测结果 AAAAAAAAAA
题目名称 数塔 最终得分 100
用户昵称 zzz 运行时间 0.011 s
代码语言 C++ 内存使用 3.29 MiB
提交时间 2018-05-29 15:34:28
显示代码纯文本
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define LL long long
#define N 510
#define mod 1000000007
#define INF 0x3f3f3f3f
#define lson root<<1
#define rson root<<1|1
int arr[N][N];
int fa[N][N];
int dp[N][N];
void prin(int j,int n)
{
    if(n==1)
    {
        printf("%d",arr[1][j]);
        return ;
    }
    prin(fa[n][j],n-1);
    printf(" %d",arr[n][j]);
}
int main()
{
    freopen("shuta.in","r",stdin);
    freopen("shuta.out","w",stdout);
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
                scanf("%d",&arr[i][j]);
        }
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                if(dp[i-1][j]>dp[i-1][j-1])
                {
                    dp[i][j] =dp[i-1][j]+arr[i][j];
                    fa[i][j] = j;
                }
                else{
                    dp[i][j] =dp[i-1][j-1]+arr[i][j];
                    fa[i][j] = j-1;
                }
            }
        }
        int ans = 0,j = -1;
        for(int i=1;i<=n;i++)
        {
            if(ans<dp[n][i])
            {
                ans = dp[n][i];
                j = i;
            }
        }
        printf("%d\n",ans);
        prin(j,n);
        puts("");
    }
    return 0;
}