萌新刚学区间 Dp 求助!
查看原帖
萌新刚学区间 Dp 求助!
414386
Isshiki·Iroha楼主2021/10/17 09:52

Wa on test 3,4

/*
	Name: Polygon
	Copyright: IOI1998
	Author: Isshiki Iroha
	Date: 17/10/21 09:35
	Description: Dp
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=55;
int n;
ll ans=-114514114514;
ll a[maxn<<1];
int op[maxn<<1];
ll dp[maxn<<1][maxn<<1];
ll dp1[maxn<<1][maxn<<1];
char t;
template<typename T>
inline T Max(T a,T b){
    return a>b?a:b;
}
template <typename T,typename... Args>
inline T Max(T x,T y,Args... args) {
    return Max(Max(x,y),Max(y,args...));
}

template<typename T>
inline T Min(T a,T b){
    return a<b?a:b;
}
template <typename T,typename... Args>
inline T Min(T x,T y,Args... args) {
    return Min(Min(x,y),Min(y,args...));
}

int main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i(1);i<=n;++i){
        cin>>t>>a[i];
        a[n+i]=a[i];
        if(t=='t')op[n+i]=op[i]=1;
        else op[n+i]=op[i]=2;
    }
    int N=n<<1;
    for(int i(1);i<=N;++i){
        dp[i][i]=a[i];
        dp1[i][i]=a[i];
    }
    for(int len(2);len<=n;++len){
        for(int i(1);i<=N-len+1;++i){
            int j=i+len-1;
            for(int k(i+1);k<=j;++k){
                if(op[k]==1){//1
                    dp[i][j]=Max(dp[i][j],dp[i][k-1]+dp[k][j]);
                    dp1[i][j]=Min(dp1[i][j],dp1[i][k-1]+dp1[k][j]);
                }
                else {
                    dp[i][j]=Max(dp[i][j],dp1[i][k-1]*dp[k][j],dp[i][k-1]*dp1[k][j],dp[i][k-1]*dp[k][j],dp1[i][k-1]*dp1[k][j]);
                    dp1[i][j]=Min(dp1[i][j],dp1[i][k-1]*dp[k][j],dp[i][k-1]*dp1[k][j],dp[i][k-1]*dp[k][j],dp1[i][k-1]*dp1[k][j]);
                }
            }
        }
    }
    for(int i(1);i<=n;++i){
        ans=max(ans,dp[i][i+n-1]);
    }
    cout<<ans<<"\n";
    for(int i(1);i<=n;++i){
        if(dp[i][i+n-1]==ans){
            cout<<i<<" ";
        }
    }
    return 0;
}

2021/10/17 09:52
加载中...