区间dp 20pts求条
查看原帖
区间dp 20pts求条
639198
Steve_xh楼主2024/10/22 17:51
#include<bits/stdc++.h>
#define int long long 
using namespace std;
typedef long long ll;
const int MAXN=55,mod=998244353,inf=0x3f3f3f3f;
int n,f[MAXN<<1|1][MAXN<<1|1],g[MAXN<<1|1][MAXN<<1|1],ans=-inf;
char c[MAXN<<1|1];
signed main(){
    // freopen("std.in","r",stdin);
    memset(f,-inf,sizeof(f));
    memset(g,inf,sizeof(g));
    cin.tie(nullptr)->sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c[i]>>f[i][i];
        g[i][i]=g[i+n][i+n]=f[i+n][i+n]=f[i][i];
        c[i+n]=c[i];
    }
    for(int len=2;len<=n;++len)
        for(int i=1;i<=n;i++){
            int j=i+len-1;
            for(int k=i;k<j;k++){
                if(c[k+1]=='t'){
                    f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);
                    g[i][j]=min(g[i][j],g[i][k]+g[k+1][j]);
                }else{
                    f[i][j]=max(f[i][j],max(max(f[i][k]*f[k+1][j],g[i][k]*g[k+1][j]),max(f[i][k]*g[k+1][j],g[i][k]*f[k+1][j])));
                    g[i][j]=min(g[i][j],min(min(g[i][k]*g[k+1][j],f[i][k]*f[k+1][j]),min(f[i][k]*g[k+1][j],g[i][k]*f[k+1][j])));
                }
            }
        }
    // cerr<<"f[1][n]: ";
    // for(int i=1;i<=n;i++)
        // cerr<<f[i][i+n-1]<<" ";
    // cerr<<'\n';
    for(int i=1;i<=n;i++)
        ans=max(ans,f[i][i+n-1]);
    cout<<ans<<'\n';
    for(int i=1;i<=n;i++)
        if(f[i][i+n-1]==ans)
            cout<<i<<" ";
    return 0;
}
2024/10/22 17:51
加载中...