P21024 小信的符文阵列 大佬求调QAQ

改过必给解决方案
image
image
为什么样例过不去,已知是一个破环成链的区间DP
这是代码

#include<bits/stdc++.h>
using namespace std;
int n,le;
int a[405],mx_dp[205][205],mi_dp[205][205];
char c[405];
void DP(int start,int end){
	memset(mx_dp,0,sizeof(mx_dp));memset(mi_dp,0,sizeof(mi_dp));
	for(int i=start;i<=end;i++){
		mi_dp[i][i]=a[i];
		mx_dp[i][i]=a[i];
	}
	for(int i=2;i<=n;i++){
		for(int l=start;l+i-1<=end;l++){
			int r=l+i-1;
			for(int k=l;k<r;k++){
				if(c[k]=='+'||c[k]=='?'){
					mx_dp[l][r]=max(mx_dp[l][k]+mx_dp[k+1][r],mx_dp[l][r]);
					mi_dp[l][r]=min(mi_dp[l][k]+mi_dp[k+1][r],mi_dp[l][r]);
				}
				
				if(c[k]=='-'||c[k]=='?'){
					mx_dp[l][r]=max(mx_dp[l][k]-mi_dp[k+1][r],mx_dp[l][r]);
					mi_dp[l][r]=min(mi_dp[l][k]-mx_dp[k+1][r],mi_dp[l][r]);
				}
				
				if(c[k]=='*'||c[k]=='?'){
					int t1=mx_dp[l][k],t2=mi_dp[l][k],t3=mi_dp[k+1][r],t4=mx_dp[k+1][r];
					mx_dp[l][r]=max(t1*t3,max(t1*t4,max(t2*t3,max(t2*t4,mx_dp[l][r]))));
					mi_dp[l][r]=min(t1*t3,min(t1*t4,min(t2*t3,min(t2*t4,mi_dp[l][r]))));
				}
			}
		}
	}
	cout<<abs(mi_dp[start][end])<<abs(mx_dp[start][end]);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>c[i];
	}
	for(int i=1;i<=n;i++){
		a[n+i]=a[i];
		c[n+i]=c[i];
	}
	for(int i=1;i<=n;i++){
		DP(i,n+i-1);
	}
	return 0;
}

笑死这道题我刚做,首先memset要给mx_dp赋值-0x3f,mn_dp赋值0x3f输出的时候要便利一遍,找到最大值最小值输出,其实个人不是很建议写函数dp(尽习惯) 还有dp开始没有特殊赋值,ac代码在我洛谷

CE的话你就自己改下吧,应该不是很难找

对了dp也只用dp一遍不用for一遍