为什么错了
查看原帖
为什么错了
944438
Only_Him楼主2023/10/29 20:44
#include <bits/stdc++.h>
using namespace std;
int n;
int m;
int a[605];
int qzh[605];
int dp[605][605];
int ans[2];
void init(bool op){
	if (!op){
		memset(dp,0x3f,sizeof(dp));
		for (int i = 0;i <= 600;i++){
			dp[i][i] = 0;
		}
		ans[0] = 0x3fffffff;
	} else{
		for (int i = 0;i <= 600;i++){
			for (int j = 0;j <= 600;j++){
				dp[i][j] = -1;
				dp[i][i] = 0;
			}
		}
		ans[1] = -1;
	}
}
void solve(bool op){
	if (!op){
		for (int si = 2;si <= n;si++){
			for (int l = 1;l + si - 1 <= m;l++){
				int r = l + si - 1;
				for (int i = l;i < r;i++){
					dp[l][r] = min(dp[l][r],dp[l][i] + dp[i + 1][r] + qzh[r] - qzh[l - 1]);
				}
			}
		}
		for (int i = 1;i <= n;i++) ans[0] = min(ans[0],dp[i][i + n - 1]);
	} else {
		for (int si = 2;si <= n;si++){
			for (int l = 1;l + si - 1 <= m;l++){
				int r = l + si - 1;
				for (int i = l;i < r;i++){
					dp[l][r] = max(dp[l][r],dp[l][i] + dp[i + 1][r] + qzh[r] - qzh[l - 1]);
				}
			}
		}
		for (int i = 1;i <= n;i++) ans[1] = max(ans[0],dp[i][i + n - 1]);
	}
}
void answer(){
	init(0);
	
	solve(0);
	
	init(1);
	
	solve(1);
}
signed main(){
	cin >> n;
	m = 2 * n;
	for (int i = 1;i <= n;i++){
		cin >> a[i];
		a[i + n] = a[i];
		
	}
	for (int i = 1;i <= m;i++){
		qzh[i] = qzh[i - 1] + a[i];
	}
	answer();
	cout << ans[0] << endl << ans[1] << endl;
	return 0;
}

WA了第2、3、4个点。 下了数据(第二个点)

P1880_2.in
46
16 4 14 12 0 3 11 8 18 2 6 8 6 7 13 7 8 14 11 2 16 12 16 0 8 1 3 10 7 16 0 16 11 17 13 18 5 15 0 12 19 0 0 5 3 1 
  
P1880_2.out
2087
10554

???

2023/10/29 20:44
加载中...