石子合并,区间dp,最小值都是错的,已经断环为链了
查看原帖
石子合并,区间dp,最小值都是错的,已经断环为链了
425333
keve楼主2022/4/1 16:27

求助,为什么求最小值永远都是错的,已经断环为链了呀。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXLEN = 1e4 + 5;
const int INF = 0x3f3f3f3f;

int N;
int dp[MAXLEN][MAXLEN];
int sum[MAXLEN];
int best[MAXLEN][MAXLEN];
int getMinValue() {
	for (int i = 1; i <= (N << 1); i++){
		best[i][i] = i;
	} 
	for (int i = (N << 1) - 1; i > 0 ; i--) {
		for (int j = i + 1; j <= (N << 1) ; j++) {
			dp[i][j] = INF;
			for(int k = best[i][j - 1]; k <= best[i + 1][j]; k++) {
				int 
				if(dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1] < INFtmp) {
				dp[i][j] = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1];
				best[i][j] = k;
				}
			}
		}
	}
	int minn = INF;
	for (int i = 1; i <= N; i++) {
		minn = min(minn, dp[i][i + N -1]);
	}
	
	return minn;
}
int getMaxValue() {
	for (int i = 1; i <= (N << 1); i++){
		best[i][i] = i;
	} 
	for (int i = (N << 1) - 1; i > 0 ; i--) {
		for (int j = i + 1; j <= (N << 1) ; j++) {
			dp[i][j] = INF;
			dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]) + sum[j] - sum[i - 1];
		}
	}
	int maxx = 0;
	for (int i = 1; i <= N; i++) {
		maxx = max(maxx, dp[i][i + N -1]);
	}
	
	return maxx;
}

signed main() {
	int tmp;
	cin >> N;
	sum[0] = 0;
	for (int i = 1; i <= N; i++) {
		cin >> tmp;
		sum[i] = sum[i - 1] + tmp;
	}
	for(int i = 1 + N; i <= 2 * N; i++) {
		sum[i] = sum[i - 1] + tmp;
	}
	
	cout << getMinValue() << endl;
	cout << getMaxValue() << endl;
	return 0;	
}
2022/4/1 16:27
加载中...