IOI1998/POJ1179/luogu4342(dp)

题面太长了不粘了


倍长区间dp,

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define fr first
#define se second
#define ll long long
const ll INF = 1e18;
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
int n;
int a[51];
bool f[101];
ll dp[101][101][2];
int main()
{
    n = read();
    rep(i,1,n)
    {
        char s = getchar();
        while(s != 't' && s != 'x') s = getchar();
        if(s == 'x') f[i] = f[i+n] = true;
        a[i] = read();
    }
    f[n+1] = f[2*n+1] = f[1];
    rep(i,1,2*n) rep(j,i,2*n) dp[i][j][1] = -INF,dp[i][j][0] = INF;
    rep(i,1,2*n) dp[i][i][1] = dp[i][i][0] = a[i>n?i-n:i];
    rep(len,2,n)
        rep(l,1,2*n-len+1)
        {
            int r = l + len - 1;
            rep(k,l,r-1)
                if(f[k+1]) dp[l][r][1] = max(dp[l][r][1],dp[l][k][0]*dp[k+1][r][0]),
                           dp[l][r][1] = max(dp[l][r][1],dp[l][k][1]*dp[k+1][r][1]),
                           dp[l][r][0] = min(dp[l][r][0],dp[l][k][1]*dp[k+1][r][0]),
                           dp[l][r][0] = min(dp[l][r][0],dp[l][k][0]*dp[k+1][r][1]),
                           dp[l][r][0] = min(dp[l][r][0],dp[l][k][0]*dp[k+1][r][0]);
                else dp[l][r][1] = max(dp[l][r][1],dp[l][k][1]+dp[k+1][r][1]),
                     dp[l][r][0] = min(dp[l][r][0],dp[l][k][0]+dp[k+1][r][0]);
        }
    ll Max = -INF;
    rep(st,1,n) Max = max(Max,dp[st][st+n-1][1]);
    printf("%lld\n",Max);
    rep(st,1,n) if(Max == dp[st][st+n-1][1]) printf("%d ",st);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1035719430/article/details/82456354