[IOI1998]Polygon

区间DP
赶紧补一补QwQ
因为它可能有负数,那么我们就维护两个值,mx和mn
说不定哪一天负数就变成正数了呢2333
然后环上区间DP操作一下

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n;
int a[55];
char c[55];
int f[55][55][2];
int cal(int a,char b,int c) {
    if(b=='t') return a+c;
    return a*c;
}
int main() {
    scanf("%d",&n);
    for(int i=0; i<n; i++)
        cin>>c[i]>>a[i],f[i][i][1]=f[i][i][0]=a[i];
    for(int l=1; l<n; l++) {
        for(int i=0; i<n; i++) {
            int j=(i+l)%n,mx=-inf,mn=inf;
            for(int k=0; k<l; k++) {
                int p1=(i+k)%n,p2=(i+k+1)%n;
                mx=max(mx,cal(f[i][p1][0],c[p2],f[p2][j][0]));
                mx=max(mx,cal(f[i][p1][1],c[p2],f[p2][j][1]));
                mn=min(mn,cal(f[i][p1][1],c[p2],f[p2][j][1]));
                mn=min(mn,cal(f[i][p1][0],c[p2],f[p2][j][0]));
            }
            f[i][j][0]=mx;
            f[i][j][1]=mn;
        }
    }
    int ans=-inf;
    for(int i=0; i<n; i++) {
        int j=(i+n-1)%n;
        ans=max(ans,f[i][j][0]);
    }cout<<ans<<endl;
    for(int i=0;i<n;i++){
        if(ans==f[i][(i+n-1)%n][0]) cout<<i+1<<' ';
    }
    
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9260382.html