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;
}