POJ 1179 Polygon(区间DP)
来源:互联网 发布:赵本山 知乎 编辑:程序博客网 时间:2024/05/16 17:10
题意:把一个多边形去掉一边,再把任意相邻打两个点合并成一个点,求最大值,
注意:两个最小的数相乘可以得到最大的数。。。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <stack>#include <map>using namespace std;#define LL long longconst LL INF =0x3f3f3f3f3f3f3f3f;int re[59];int in[59];int op[59];int inop[59];int n;LL dp[59][59];LL dp1[59][59];LL ss(int k,LL a,LL b){ if(k==1) return a+b; else return a*b;}int oor(){ for(int i=0;i<n;i++) for(int j=0;j<n;j++) dp[i][j] = -INF,dp1[i][j] = INF; for(int i=0;i<n;i++) dp[i][i] = re[i],dp1[i][i] = re[i]; // for(int i=n-1;i>=0;i--) cout<<re[i]<< ' ';cout<<endl; for(int l=1;l<n;l++) { for(int i=n-l-1;i>=0;i--) { LL tmp = -INF; LL tmp1 = INF; for(int j=0;j<l;j++) { tmp = max(tmp,ss(op[i+j],dp[i][i+j],dp[i+j+1][i+l])); tmp = max(tmp,ss(op[i+j],dp1[i][i+j],dp[i+j+1][i+l])); tmp = max(tmp,ss(op[i+j],dp[i][i+j],dp1[i+j+1][i+l])); tmp = max(tmp,ss(op[i+j],dp1[i][i+j],dp1[i+j+1][i+l])); tmp1 = min(tmp1,ss(op[i+j],dp[i][i+j],dp[i+j+1][i+l])); tmp1 = min(tmp1,ss(op[i+j],dp1[i][i+j],dp[i+j+1][i+l])); tmp1 = min(tmp1,ss(op[i+j],dp[i][i+j],dp1[i+j+1][i+l])); tmp1 = min(tmp1,ss(op[i+j],dp1[i][i+j],dp1[i+j+1][i+l])); } dp[i][i+l] = tmp; dp1[i][i+l] = tmp1; //cout<<tmp<<' '; }//cout<<endl; } return dp[0][n-1];}int anscnt[59];void solve(){ int cnt = 0; LL ans = -INF; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { re[j] = in[(i+j)%n]; op[j] = inop[(i+j)%n]; } LL k = oor(); if(ans<k) { cnt = 0; anscnt[cnt++] = i; ans = k; }else if(ans==k) { anscnt[cnt++] = i; } } cout<<ans<<endl; for(int i=0;i<cnt;i++) { if(i) printf(" "); printf("%d",anscnt[i]+1); }printf("\n");}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif while(~scanf("%d",&n)) { char ch[9]; for(int i=0;i<n;i++) { scanf("%s%d",ch,&in[i]); if(ch[0]=='t') inop[i] = 1; else inop[i] = 2; } int tmp = inop[0]; for(int i=0;i<n;i++) inop[i] = inop[i+1];inop[n-1] = tmp; solve(); } return 0;}
- POJ 1179 Polygon(区间DP)
- POJ 1179 Polygon(环形区间DP)
- POJ 1179 Polygon(区间DP)
- POJ 1179 Polygon(区间DP)
- POJ 1179 Polygon 区间DP
- POJ 1179 Polygon(区间DP) -补充
- poj 1179 Polygon(化环为直+区间dp)
- POJ 1179 Polygon(DP)
- POJ 1179 Polygon DP
- POJ 1179 Polygon dp
- POJ 1179 Polygon (DP)
- poj 1179 Polygon(DP)
- 经典问题五.(乘号两边有正负 区间dp)Polygon poj 1179
- POJ 1179 区间DP
- POJ 1179 Polygon 记忆化dfs vs dp
- POJ 1179 Polygon(环形DP 矩阵连乘)
- POJ 2955(区间dp)
- poj 1651(区间dp)
- Android为按钮添加相应事件
- 用c为python写个简单的模块
- ibatis学习之--4、添加用户的信息
- ibatis学习之--5、根据id删除指定用户的信息
- U盘安装Centos6.3
- POJ 1179 Polygon(区间DP)
- Java ClassLoader机制
- POJ上的水题
- linux按键驱动
- 判断设备标识符
- hbase shell基础和常用命令详解
- 学习C#第一课笔记
- Windows下使用cwRsync服务器(Linux作客户端)
- java odbc jdbc 连接Access