poj1179 环形+区间dp

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1179 环形+区间dp相关的知识,希望对你有一定的参考价值。

因为要用到模,所以左起点设置为0比较好

#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
char c[55];
int val[55],dp_max[55][55],dp_min[55][55];
int cal(char x,int a,int b){if(x==t)return a+b;return a*b;}

int main(){
    int n;
    while(scanf("%d",&n)==1){
        for(int i=0;i<n;i++) cin>>c[i]>>val[i];
        for(int i=0;i<n;i++) dp_min[i][i]=dp_max[i][i]=val[i];//长度为1的情况
        for(int len=1;len<n;len++)
            for(int l=0;l<n;l++){//枚举左端点 
                int MAX=-INF,MIN=INF; 
                int r=(l+len)%n;    
                for(int k=0;k<len;k++){
                    int p1=(l+k)%n,p2=(l+k+1)%n;
                    MAX=max(MAX,cal(c[p2],dp_max[l][p1],dp_max[p2][r]));
                    MAX=max(MAX,cal(c[p2],dp_min[l][p1],dp_min[p2][r]));
                    MIN=min(MIN,cal(c[p2],dp_max[l][p1],dp_max[p2][r]));
                    MIN=min(MIN,cal(c[p2],dp_min[l][p1],dp_min[p2][r]));
                }
                dp_max[l][r]=MAX;
                dp_min[l][r]=MIN;
            }
        int ans=-INF;
        for(int l=0;l<n;l++){
            int r=(l+n-1)%n;
            ans=max(ans,dp_max[l][r]);
        }     
        printf("%d
",ans);
        for(int l=0;l<n;l++){
            int r=(l+n-1)%n;
            if(dp_max[l][r]==ans) printf("%d ",l+1);
        }
        puts("");
    }
    return 0;
}

 

以上是关于poj1179 环形+区间dp的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1179 - Polygon - [区间DP]

poj1179 区间dp(记忆化搜索写法)有巨坑!

poj1179 Polygon区间DP

POJ 1179 Polygon

洛谷 P4342 / poj 1179 Polygon

[环形 区间 DP] 能量项链