玄学2小时
查看原帖
玄学2小时
1393834
Recursively_dumb楼主2025/7/1 21:22

dp小白在最后一个测试点被硬控2小时,望dalao们可以多多指教

#include<bits/stdc++.h>
using namespace std;
int n,a[1005],dp[50][2005][2005],ans=-0x3f3f3f3f;
char b[1005];
int main()
{
	scanf("%d\n",&n);
	memset(dp[1],-0x3f3f3f3f,sizeof(dp[1]));
	memset(dp[2],0x3f3f3f3f,sizeof(dp[2]));
	for(int i=1;i<=n;i++)
	{
		scanf("%c %d",&b[i],&a[i]);
		getchar();
		b[i+n]=b[i];
		dp[2][i][i]=dp[2][n+i][n+i]=dp[1][i+n][i+n]=dp[1][i][i]=a[n+i]=a[i];
	}
	for(int len=2;len<=n;len++)
		for(int l=1,r=len;r<=2*n;l++,r++)
			for(int i=l;i<r;i++)
			{
				if(b[i+1]=='x')
				{
					dp[1][l][r]=max(dp[1][l][r],max(dp[1][l][i]*dp[1][i+1][r],max(dp[2][l][i]*dp[2][i+1][r],max(dp[1][l][i]*dp[2][i+1][r],dp[2][l][i]*dp[1][i+1][r]))));
					dp[2][l][r]=min(dp[1][l][r],min(dp[1][l][i]*dp[1][i+1][r],min(dp[2][l][i]*dp[2][i+1][r],min(dp[1][l][i]*dp[2][i+1][r],dp[2][l][i]*dp[1][i+1][r]))));
				}
				else if(b[i+1]=='t')
				{
					dp[1][l][r]=max(dp[1][l][r],dp[1][l][i]+dp[1][i+1][r]);
					dp[2][l][r]=min(dp[2][l][r],dp[2][l][i]+dp[2][i+1][r]);
				}
				if(len==n)
					ans=max(ans,dp[1][l][r]);
			}
	printf("%d\n",ans);
	for(int i=1;i<=n;i++)
		if(dp[1][i][i+n-1]==ans)
			printf("%d ",i);
	return 0;
}
2025/7/1 21:22
加载中...