求助(没过样例)
查看原帖
求助(没过样例)
335552
Christophe_楼主2021/8/5 23:40
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int n,f1[N][N],f2[N][N],a[N],sum[N];
void init() {
	cin>>n;//输入
	memset(f1,0x3f,sizeof(f1));//求最小值
	memset(f2,0xcf,sizeof(f2));//求最大值
	for(int i=1; i<=n; ++i) {
		cin>>a[i];//输入
		sum[i]=sum[i-1]+a[i];//前缀和累加
		f1[i][i]=f2[i][i]=0;//初始化
	}
	for(int i=n+1; i<=2*n-1; ++i) {//破环为链
		a[i]=a[i-n];//存两边
		sum[i]=sum[i-1]+a[i];//前缀和累加
		f1[i][i]=f2[i][i]=0;//初始化
	}
}
void solve() {
	for(int len=2; len<=n; ++len)//阶段:长度
		for(int l=1; l<=n-len+1; ++l) {//状态:左端点
			int r=l+len-1;//状态:右端点
			for(int k=l; k<r; ++k) {//决策:断点
				f1[l][r]=min(f1[l][r],f1[l][k]+f1[k+1][r]);//求最小值
				f2[l][r]=max(f2[l][r],f2[l][k]+f2[k+1][r]);//求最大值
			}
			f1[l][r]+=sum[r]-sum[l-1];//补足最小值
			f2[l][r]+=sum[r]-sum[l-1];//补足最大值
		}
}
void out() {
	int ans1=0x3f3f3f3f,ans2=0xcfcfcfcf;//答案
	for(int i=1; i<=n; ++i) {//枚举所有链
		ans1=min(ans1,f1[i][i+n-1]);//求最小值
		ans2=max(ans2,f2[i][i+n-1]);//求最大值
	}
	cout<<ans1<<endl<<ans2<<endl;//输出
}
int main() {
	init();
	solve();
	out();
	return 0;
}

难道是破环为链的问题?

2021/8/5 23:40
加载中...