P1880 石子合并 0pts不过样例WA求调,ans1和ans2并没有被修改
查看原帖
P1880 石子合并 0pts不过样例WA求调,ans1和ans2并没有被修改
958953
0920_qwq_cyq楼主2023/3/12 20:03
#include <bits/stdc++.h>
using namespace std;
int n, m, a[105], s[105], f1[305][305], f2[305][305], ans1 = 10000000, ans2;
int sum(int l, int r){
	return s[r]- s[l - 1];
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	for(int i = 1; i <= n; i++){
		s[i] = s[i - 1] + a[i];
	}
	a[0] = a[n];
	a[2 * n + 1] = a[1];
	for(int i = 0; i <= 2 * n + 1; i++){
		f1[i][i] = a[i];
		f2[i][i] = a[i];
	}
	for(int len = 2; len <= n; len++){
		for(int i = 1; i + len - 1 <= 2 * n; i++){
			int j = i + len - 1;
			f1[i][j] = 10000000;
			for(int k = i; k <= j - 1; k++){
				f1[i][j] = min(f1[i][j], f1[i][k] + f1[k + 1][j] + sum(i, j));
			}
		}
	}
	for(int len = 2; len <= n; len++){
		for(int i = 1; i + len - 1 <= 2 * n; i++){
			int j = i + len - 1;
			for(int k = i + 1; k <= j - 1; k++){
				f2[i][j] = max(f2[i][j], f2[i][k] + f2[k + 1][j] + sum(i, j));
//				cout << f2[i][j] << " " << f1[i][j] << " ";
			}
		}
//		cout << endl;
	}
	for(int i = 1; i < n; i++){
		if(f1[i][i + n]){
			ans1 = min(ans1, f1[i][i + n]);
		}
	}
	for(int i = 1; i < n; i++){
		ans2 = max(ans2, f2[i][i + n]);
	}
	cout << ans1 << endl << ans2 << endl;
	return 0;
}
2023/3/12 20:03
加载中...