区间DP 经典题求助
查看原帖
区间DP 经典题求助
767561
Ascnbeta楼主2024/7/18 16:42

这是我的AC code:

#include <bits/stdc++.h>
using namespace std;
int n,m[205];
int f[204][204];
int sum[205],ans = 0x3f3f3f3f;
int main () {
	cin >> n;
	memset(f,0x3f,sizeof(f));
	for (int i = 1; i<= n ;i++) {
		cin >> m[i];
		m[i+n] = m[i];
	}
	for (int i = 1; i <= 2 * n; i++) {
		sum[i] = sum[i-1]+m[i];
		f[i][i] = 0;
	}
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= 2*n - i + 1; j++) {
			int end = j + i -1;
			for (int k = j; k <= end; k++) {
				f[j][end] = min(f[j][end],f[j][k]+f[k+1][end]+sum[end]-sum[j-1]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		ans = min(ans,f[i][i+n-1]);
	}
	cout << ans << endl;
	memset(f,0,sizeof(f));
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= 2*n - i + 1; j++) {
			int end = j + i -1;
			for (int k = j; k <= end; k++) {
				f[j][end] = max(f[j][end],f[j][k]+f[k+1][end]+sum[end]-sum[j-1]);
			}
		}
	}
	ans = 0;
	for (int i = 1; i <= n; i++) {
		ans = max(ans,f[i][i+n-1]);
	}
	cout << ans / 2 << endl;
	return 0;
}

为什么最后输出最大值的时候需要 ÷2\div 2 ,但最小值就不用呢?

2024/7/18 16:42
加载中...