最后一点过不去,求助
查看原帖
最后一点过不去,求助
234582
zpl__hhd楼主2021/2/5 16:51
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll ans=-0x7fffffff+1;
ll a[120];
char c[120];
vector<int> ar;
ll dp1[120][120],dp2[120][120];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>c[i];
		c[i+n]=c[i];
		scanf("%lld",&a[i]);
		a[i+n]=a[i];
	}
	int m=2*n-1;
	memset(dp1,-0x3f3f3f3f+1,sizeof(dp1));
	memset(dp2,0x3f3f3f3f,sizeof(dp2));
	for(int i=1;i<=2*n;i++)
 	dp1[i][i]=dp2[i][i]=a[i];
	for(int len=2;len<=m;len++)
	{
		for(int l=1;l+len-1<=m;l++)
		{
			int r=l+len-1;
			for(int k=l;k<r;k++)
			{				
				if(c[k+1]=='t')
				{
					dp1[l][r]=max(dp1[l][r],dp1[l][k]+dp1[k+1][r]);
					dp2[l][r]=min(dp2[l][r],dp2[l][k]+dp2[k+1][r]);
				}
				else
				{
				 dp1[l][r]=max(max(max(max(dp1[l][r],dp1[l][k]*dp1[k+1][r]),dp2[l][k]*dp2[k+1][r]),dp1[l][k]*dp2[k+1][r]),dp2[l][k]*dp1[k+1][r]);
				 dp2[l][r]=min(min(min(min(dp1[l][r],dp1[l][k]*dp1[k+1][r]),dp2[l][k]*dp2[k+1][r]),dp1[l][k]*dp2[k+1][r]),dp2[l][k]*dp1[k+1][r]);
				}
			}
		}
	}
	for(int t=1;t<=n;t++)
	{
		if(dp1[t][t+n-1]>ans)
		{
			ans=dp1[t][t+n-1];
			ar.clear();
			ar.push_back(t);
		}
		else if(dp1[t][t+n-1]==ans)
		ar.push_back(t);
	}
	cout<<ans<<endl;
	for(int i=0;i<ar.size();i++)
	printf("%d ",ar[i]);
}```
2021/2/5 16:51
加载中...