#include <cstdio>
#include <cstring>
const int MAXN = 102;
struct DP{
int a,b[MAXN];
};
DP ff[MAXN][MAXN];//ij表示到第i个花瓶插到了j束花的最大美学值
int b[MAXN][MAXN];//花束i插到花瓶j的美学值
int f,v;
inline int oi_max(int a,int b){
return a>b?a:b;
}
int main()
{
scanf("%d%d",&f,&v);
for(int i = 1; i <= f ; i ++){
for(int j = 1 ; j <= v; j ++){
scanf("%d",&b[i][j]);
ff[j][i].a = -2139062144;
}
}
for(int i = 1; i <= v; i ++){
for(int j = 1; j <= i && j <= f; j ++){
ff[i][j].a = oi_max(ff[i-1][j].a,ff[i-1][j-1].a+b[j][i]);
if(ff[i][j].a == ff[i-1][j-1].a+b[j][i]){
for(int k = 1; k < j ; k++){
ff[i][j].b[k] = ff[i-1][j-1].b[k];
}
ff[i][j].b[j] = i;
}
else{
for(int k = 1; k <= j ; k++){
ff[i][j].b[k] = ff[i-1][j].b[k];
}
}
}
}
/*int mx = 0;
int j = 0;
for(int i = 1; i <= f; i++){
mx = oi_max(ff[v][i].a,mx);
if(mx == ff[v][i].a) j = i;
}
printf("%d\n",mx);*/
printf("%d\n",ff[v][f].a);
for(int i = 1; i <= f;i ++){
if(ff[v][f].b[i] != 0)
printf("%d ",ff[v][f].b[i]);
else
printf("?%d?",i);
}
return 0;
}
rt,第二个点我只输出了49束花,怎么也找不出来为什么第一束花程序没有考虑