如题,代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MXN=605;
int n,k;
int arr[MXN][MXN],ans[MXN];
int dp[MXN][MXN],pre[MXN][MXN];
inline int cal(int l,int r){return arr[r-1][n]-arr[l-1][n]-arr[r-1][r-1]+arr[l-1][r-1];}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
scanf("%d",&arr[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
arr[i][j]+=arr[i-1][j]+arr[i][j-1]-arr[i-1][j-1];
memset(dp,~0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;i++){
dp[i][0]=1;
int tmp;
for(int j=1;j<=k && j<=i;j++)
for(int l=j-1;l<i;l++)
if((tmp=max(dp[i][j],dp[l][j-1]+cal(l,i)))>dp[i][j]){
dp[i][j]=tmp;
pre[i][j]=l;
}
}
int pos=0;
for(int i=1;i<=n;i++)
if(dp[i][k]>dp[pos][k])
pos=i;
for(int i=k;i;i--){
ans[i]=pos;
pos=pre[pos][i];
}
for(int i=1;i<=k;i++)printf("%d ",ans[i]-1);
return 0;
}