60分求助!
查看原帖
60分求助!
804607
rainygame楼主2023/4/5 19:56
#include <bits/stdc++.h>
using namespace std;
#define MAXN 601
#define MAXK 101

int n, k;
int a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN];
int f[MAXN][MAXK], last[MAXN][MAXK];
stack<int> st;

void print(int k, int p) {
	if (!k) return;
	print(k-1, last[k][p]);
	cout << p << " ";
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> k;
	for (int i=1; i<=n; i++) {
		for (int j=i+1; j<=n; j++) cin >> a[i][j];
		for (int j=n; j>i; j--) b[i][j] = b[i][j+1] + a[i][j];
	}
	for (int j=n-1; j>=1; j--){
		for (int i=j; i>=1; i--) c[i][j] = c[i+1][j] + b[i][j+1];
	}
	
	memset(f, -0x3f, sizeof(f));
	f[0][0] = 0;
	for (int i=1; i<=k+1; i++){
		for (int j=1; j<=n; j++){
			for (int p=0; p<j; p++){
				if (f[i-1][p] + c[p+1][j] > f[i][j]){
					f[i][j] = f[i-1][p] + c[p+1][j];
					last[i][j] = p;
				}
			}
		}
	}
	
	print(k, last[k+1][n]);
	
	return 0;
}

2023/4/5 19:56
加载中...