• 【POJ1179】Polygon 区间DP


    这道题是典型的环形石子归并模型,破环成链后时间复杂度为(O(n^3))

    不过,因为题目中所给的数字可能是负数,仅仅记录区间内合并之后的最大值并不满足动态规划的最优子结构性质。因此,还需要额外记录下区间合并后的最小值,由最小值和最大值即可组合出整个区间的最大值。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int maxn=110;
    
    char s[2];
    int n,num[maxn],head[maxn];//0->+ 1->*
    struct node{
    	long long mx,mi;
    }dp[maxn][maxn];
    vector<int> v;
    
    void read_and_parse(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){//破环成链
    		scanf("%s%d",s,&num[i]);
    		if(s[0]=='t')head[i]=0;
    		else head[i]=1;
    		num[i+n]=num[i],head[i+n]=head[i];
    	}
    	for(int i=1;i<=n;i++){//初始化
    		dp[i][i].mx=dp[i+n][i+n].mx=num[i];
    		dp[i][i].mi=dp[i+n][i+n].mi=num[i];
    	}
    }
    
    const int inf=0x3f3f3f3f;
    
    void solve(){
    	for(int len=2;len<=n;len++){
    		for(int l=1;l<=2*n-len+1;l++){
    			int r=l+len-1;
    			dp[l][r].mi=inf,dp[l][r].mx=-inf;
    			for(int k=l;k<r;k++){
    				if(head[k+1]){
    					dp[l][r].mx=max(dp[l][r].mx,dp[l][k].mi*dp[k+1][r].mi);
    					dp[l][r].mx=max(dp[l][r].mx,dp[l][k].mx*dp[k+1][r].mx);
    					dp[l][r].mi=min(dp[l][r].mi,dp[l][k].mx*dp[k+1][r].mx);
    					dp[l][r].mi=min(dp[l][r].mi,dp[l][k].mi*dp[k+1][r].mi);
    					dp[l][r].mi=min(dp[l][r].mi,dp[l][k].mx*dp[k+1][r].mi);
    					dp[l][r].mi=min(dp[l][r].mi,dp[l][k].mi*dp[k+1][r].mx);
    				}
    				else{
    					dp[l][r].mx=max(dp[l][r].mx,dp[l][k].mx+dp[k+1][r].mx);
    					dp[l][r].mi=min(dp[l][r].mi,dp[l][k].mi+dp[k+1][r].mi);
    				}
    			}
    		}
    	}
    	long long ans=-inf;
    	for(int i=1;i<=n;i++){
    		if(dp[i][i+n-1].mx>ans){
    			v.clear(),v.push_back(i);
    			ans=dp[i][i+n-1].mx;
    		}
    		else if(dp[i][i+n-1].mx==ans)
    			v.push_back(i);
    	}
    	printf("%lld
    ",ans);
    	for(int i=0;i<v.size();i++)
    		printf("%d%c",v[i],i==v.size()-1?'
    ':' ');
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    svn服务器的搭建和使用以及git服务器的搭建和使用
    MySQL Performance Schema详解
    Lua集成Redis及Nginx
    分布式系统下的CAP定理
    分布式事务一站式解决方案与实现
    Zookeeper集群搭建及原理
    Redis主从复制搭建及原理
    vue中给img的src添加token
    调度器34—RT负载均衡 Hello
    tracer ftrace笔记(5)—— 使用笔记汇总 Hello
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9830703.html
Copyright © 2020-2023  润新知