[IOI1998]Polygon

区间DP
赶紧补一补QwQ
因为它可能有负数,那么我们就维护两个值,mx和mn
说不定哪一天负数就变成正数了呢2333
然后环上区间DP操作一下

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n;
int a[55];
char c[55];
int f[55][55][2];
int cal(int a,char b,int c) {
	if(b=='t') return a+c;
	return a*c;
}
int main() {
	scanf("%d",&n);
	for(int i=0; i<n; i++)
		cin>>c[i]>>a[i],f[i][i][1]=f[i][i][0]=a[i];
	for(int l=1; l<n; l++) {
		for(int i=0; i<n; i++) {
			int j=(i+l)%n,mx=-inf,mn=inf;
			for(int k=0; k<l; k++) {
				int p1=(i+k)%n,p2=(i+k+1)%n;
				mx=max(mx,cal(f[i][p1][0],c[p2],f[p2][j][0]));
				mx=max(mx,cal(f[i][p1][1],c[p2],f[p2][j][1]));
				mn=min(mn,cal(f[i][p1][1],c[p2],f[p2][j][1]));
				mn=min(mn,cal(f[i][p1][0],c[p2],f[p2][j][0]));
			}
			f[i][j][0]=mx;
			f[i][j][1]=mn;
		}
	}
	int	ans=-inf;
	for(int i=0; i<n; i++) {
		int j=(i+n-1)%n;
		ans=max(ans,f[i][j][0]);
	}cout<<ans<<endl;
	for(int i=0;i<n;i++){
		if(ans==f[i][(i+n-1)%n][0]) cout<<i+1<<' ';
	}
	
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9260382.html