还是SGU的数据强啊,同样一道题目,我的代码明显存在Bug的,对全负数的情况处理不周,看来以后不能以AC为目标。
代码的健壮性是值得商榷的。
#include <stdio.h>
#include <string.h>
#define N 105
#define INF 1 << 28
int a[N][N], pre[N][N], stack[N];
int main()
{
    int f, v;
    while(~scanf("%d %d", &f, &v))
    {
        for(int i = 1; i <= f; i++)
            for(int j = 1; j <= v; j++)
            {
                scanf("%d", &a[i][j]);
                if(i > j) a[i][j] = -INF;//这里不加,可以过PKU,不加这句后面的循环需要改动其实位置,不然是错误的。
                pre[i][j] = -1;
            }
        for(int i = 2; i <= f; i++)
        {
            for(int j = i; j <= v; j++)
            {
                int mmin = -INF;
                for(int k = 1; k < j; k++)
                {
                    if(a[i - 1][k] > mmin)
                    {
                        mmin = a[i - 1][k];
                        pre[i][j] = k;
                    }
                }
                a[i][j] += mmin;
            }
        }
        int ans = -INF, top = 0;
        for(int i = f; i <= v; i++)
        {
            if(a[f][i] > ans)
            {
                ans = a[f][i];
                stack[top] = i;
            }
        }
        while(f != 1)
        {
            int t = stack[top];
            stack[++top] = pre[f][t];
            f--;
        }
        printf("%d\n", ans);
        for(int i = top; i >= 0; i--)
        {
            printf("%d", stack[i]);
            if(i) printf(" ");
            else printf("\n");
        }
    }
    return 0;
}