还是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;
}