0
点赞
收藏
分享

微信扫一扫

POJ - 1179 Polygon(区间DP)

何以至千里 2022-02-03 阅读 25
动态规划

POJ - 1179 Polygon(区间DP)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 110, INF = 1<<15;
int w[N],f[N][N],g[N][N];
char op[N];

int main()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>op[i]>>w[i];
		op[i+n]=op[i],w[i+n]=w[i];
	} 
	for(int len=1;len<=n;len++)
	{
		for(int l=1;l+len-1<=n*2;l++)
		{
			int r=l+len-1;
			if(len==1) f[l][r]=g[l][r]=w[l];
			else
			{
				f[l][r]=-INF,g[l][r]=INF;
				for(int k=l;k<r;k++)
				{
					char c=op[k+1];
					int minl=g[l][k],minr=g[k+1][r];
					int maxl=f[l][k],maxr=f[k+1][r];
					if(c=='t')
					{
						f[l][r]=max(f[l][r],maxl+maxr);
						g[l][r]=min(g[l][r],minl+minr);
					}
					else
					{
						int x1=maxl*maxr,x2=maxl*minr,x3=minl*maxr,x4=minl*minr;
                        f[l][r]=max(f[l][r],max(max(x1,x2),max(x3,x4)));
                        g[l][r]=min(g[l][r],min(min(x1,x2),min(x3,x4)));
					}
				}
			}
		}
	}
	int res=-INF;
	for(int i=1;i<=n;i++)
		res=max(res,f[i][i+n-1]);
	cout<<res<<endl;
	
	for(int i=1;i<=n;i++)
		if(res==f[i][i+n-1])
			cout<<i<<" ";
	return 0;
} 
举报

相关推荐

0 条评论