这道题是典型的环形石子归并模型,破环成链后时间复杂度为\(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\n",ans);
for(int i=0;i<v.size();i++)
printf("%d%c",v[i],i==v.size()-1?'\n':' ');
} int main(){
read_and_parse();
solve();
return 0;
}

【POJ1179】Polygon 区间DP的更多相关文章

  1. POJ1179 Polygon 区间DP

    题目大意: 多边形游戏,有N个顶点的多边形,3 <= N <= 50 ,多边形有N条边,每个顶点中有一个数字(可正可负),每条边上或者是“+”号,或者是“*”号.边从1到N编号,首先选择一 ...

  2. POJ 1179 - Polygon - [区间DP]

    题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...

  3. IOI1998 Polygon [区间dp]

    [IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...

  4. IOI 98 (POJ 1179)Polygon(区间DP)

    很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...

  5. poj1179多边形——区间DP

    题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后 ...

  6. 【IOI1998】Polygon 区间DP

    题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...

  7. [IOI1998] Polygon (区间dp,和石子合并很相似)

    题意: 给你一个多边形(可以看作n个顶点,n-1条边的图),每一条边上有一个符号(+号或者*号),这个多边形有n个顶点,每一个顶点有一个值 最初你可以把一条边删除掉,这个时候这就是一个n个顶点,n-2 ...

  8. poj1179 环形+区间dp

    因为要用到模,所以左起点设置为0比较好 #include<iostream> #include<cstdio> #include<cstring> #define ...

  9. 「IOI1998」「LuoguP4342」Polygon(区间dp

    P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...

随机推荐

  1. 腾讯云COS体验

    其实这篇文章本来是推荐COS的,写了一半发现COS的免费额度取消了,2019年之后的开通的用户免费6个月,老用户不受影响,这还让我怎么推荐啊?!写都写了,删掉岂不是白浪费时间? 都怪你!腾讯云! 起因 ...

  2. 针对Nginx日志的相关运维操作记录

    在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...

  3. C_数据结构_递归实现累加

    # include <stdio.h> long sum(int n) { //用递归实现: ) ; else ) + n; /* 用for循环实现: long s = 0; int i; ...

  4. 牛客第二场-J-farm-二维树状数组

    二维树状数组真的还挺神奇的,更新也很神奇,比如我要更新一个区域内的和,我们的更新操作是这样的 add(x1,y1,z); add(x2+1,y2+1,z); add(x1,y2+1,-z); add( ...

  5. D. Cutting Out

    ---恢复内容开始--- 链接 [https://codeforces.com/contest/1077/problem/D] 题意 给你n,k,n个数,找出长度为k,的子串(不需连续),使得该子串数 ...

  6. (第十二周)final预发布视频

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 Final阶段视频发布 平台:优酷 链接:http://v.youku.com/v_show/id_XMTg0 ...

  7. 结对项目 https://github.com/quchengyu/jiedui/tree/quchengyu-patch-1

    所选项目名称:文本替换      结对人:傅艺伟 github地址 : https://github.com/quchengyu/jiedui/tree/quchengyu-patch-1 用一个新字 ...

  8. html之间传递参数

    转自:http://blog.163.com/yangzhanghui_job/blog/static/179575062201271624839972/ aa.html 往 bb.html 传参 a ...

  9. 伪静态与重定向--RewriteBase

    RewriteBase用于设置目录级重写的基准URL,即所有的重定向都是基于这个URL.内部重定向可能看不出效果,但是在外部重定向(使用R flag后),如果不手动指定 / 为根目录,那么就会去整个磁 ...

  10. PAT 1022 D进制的A+B

    https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344 输入两个非负10进制整数A和B(<=2 ...