DP题,并不难。
#include <cstdio>
const int maxn = 106;
const int oo = 0x3f3f3f3f;
inline int read()
{
int x = 0, f = 1, t = getchar();
while(t < '0' || t > '9') {
if(t == '-') f = -1;
t = getchar();
}
while(t >= '0' && t <= '9') {
x = (x << 1) + (x << 3) + t - '0';
t = getchar();
}
return x * f;
}
int n, m;
int a[maxn][maxn];
int f[maxn][maxn]; //f[i][j] ---> 第i种花,放到了第j行时的最大美观度
int p[maxn][maxn];
void init()
{
n = read(), m = read();
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
a[i][j] = read();
}
void print(int d, int x)
{
if(d == 0) return ;
print(d-1, p[d][x]);
printf("%d", x);
if(d < n) putchar(' ');
else puts("");
}
void work()
{
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m-n+i; ++j) {
int &r = f[i][j];
r = -oo;
for(int k = i-1; k < j; ++k) {
if(r < f[i-1][k]) {
r = f[i-1][k];
p[i][j] = k;
}
}
if(r != -oo) r += a[i][j];
}
}
int ans = -oo, x;
for(int i = n; i <= m; ++i) {
if(ans < f[n][i]) {
ans = f[n][i];
x = i;
}
}
printf("%d\n", ans);
print(n, x);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
init();
work();
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}