【輸入樣例】
3 5 7 23 –5 –24 16 5 21 -4 10 23 -21 5 -4 -20 20
【輸出樣例】
53 2 4 5
#include<bits/stdc++.h>
using namespace std;
int f,v,dp[101][101],ma[101][101],ans[101][101];
int main()
{
//memset(dp,-0x3f,sizeof(dp));
cin>>f>>v;
for(int i=1;i<=f;i++)
{
for(int j=1;j<=v;j++)
cin>>ma[i][j];
}//輸入
for(int i=1;i<=f;i++)
dp[i][i]=dp[i-1][i-1]+ma[i][i];//這我卡了一會,在洛谷看了題解纔想起來了這個初值
for(int i=1;i<=v;i++)
for(int j=1;j<=f;j++)
{
dp[i][j]=-1e+8;//初值,因爲有負數所以0不行
for(int k=0;k<=i-j;k++)//枚舉子問題
{
if(dp[k+j-1][j-1]+ma[j][k+j]>dp[i][j])
{
ans[i][j]=k+j;
dp[i][j]=dp[k+j-1][j-1]+ma[j][k+j];
}
}
}
cout<<dp[v][f]<<endl;//輸出最大值
stack<int> st;
int a=f,b=v;
for(int i=1;i<=f;i++)//反推過程
{
st.push(ans[b][a]);
b=ans[b][a]-1;
a--;
}
bool f=1;
while(!st.empty())//輸出過程
{
if(f)
{
f=0;
cout<<st.top();
}
else cout<<" "<<st.top();
st.pop();
}
}