求助,第三个点一直过不去,各位帮忙看看吧,谢谢
查看原帖
求助,第三个点一直过不去,各位帮忙看看吧,谢谢
272314
Autonomier楼主2020/8/16 11:59
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
inline int read()
{
	int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
int n;
int a[102];
char s[102];
int dp[100][100][2]; 
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		scanf("%c",&s[i]);
		a[i]=read();
		s[i+n]=s[i];
		a[i+n]=a[i];
	}
	for(int i=1;i<=n*2;i++)
	{
		dp[i][i][0]=dp[i][i][1]=a[i];
	}
	for(int len=2;len<=n;len++)
	{
		for(int i=1;i+len-1<=n*2-1;i++)
		{
			int j=i+len-1;
			dp[i][j][0]=-0x3f3f3f3f;
			dp[i][j][1]=0x3f3f3f3f;
			for(int k=i;k<j;k++)//这里一定是<j! 
			{
				if(s[k+1]=='t')
				{
					dp[i][j][0]=max(dp[i][j][0],dp[i][k][0]+dp[k+1][j][0]);
					dp[i][j][1]=min(dp[i][j][1],dp[i][k][1]+dp[k+1][j][1]);
				}
				else
				{
					dp[i][j][0]=max(dp[i][j][0],dp[i][k][0]*dp[k+1][j][0]);
					dp[i][j][0]=max(dp[i][j][0],dp[i][k][1]*dp[k+1][j][1]);
					dp[i][j][0]=max(dp[i][j][0],dp[i][k][1]*dp[k+1][j][0]);
					dp[i][j][0]=max(dp[i][j][0],dp[i][k][0]*dp[k+1][j][1]);
					dp[i][j][1]=min(dp[i][j][1],dp[i][k][1]*dp[k+1][j][1]);
					dp[i][j][1]=min(dp[i][j][1],dp[i][k][1]*dp[k+1][j][0]);
					dp[i][j][1]=min(dp[i][j][1],dp[i][k][0]*dp[k+1][j][1]);
					dp[i][j][1]=min(dp[i][j][1],dp[i][k][0]*dp[k+1][j][0]);
				}
			}
		}
	}
	int res=-0x3f3f3f3f;
	vector<int> Edge;
	for(int i=1;i<=n;i++)
	{
		if(dp[i][i+n-1][0]>res)
		{
			res=dp[i][i+n-1][0];
			Edge.clear();
			Edge.push_back(i);
		}
		else if(dp[i][i+n-1][0]==res)
		{
			Edge.push_back(i);
		}
	}
	printf("%d\n",res);
	for(int i=0;i<Edge.size();i++)
	{
		printf("%d ",Edge[i]);
	}
	printf("\n");
 	return 0;
}
/*
4
t -7 t 4 x 2 x 5
*/
2020/8/16 11:59
加载中...