这道题是典型的环形石子归并模型,破环成链后时间复杂度为\(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. C# 大型电商项目性能优化(一)

    经过几个月的忙碌,我厂最近的电商平台项目终于上线,期间遇到的问题以及解决方案,也可以拿来和大家多做交流了. 我厂的项目大多采用C#.net,使用逐渐发展并流行起来的EF(Entity Framewor ...

  2. 利用卷积神经网络(VGG19)实现火灾分类(附tensorflow代码及训练集)

    源码地址 https://github.com/stephen-v/tensorflow_vgg_classify 1. VGG介绍 1.1. VGG模型结构 1.2. VGG19架构 2. 用Ten ...

  3. Linux运维笔记-日常操作命令总结(3)

    文本操作:sed sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作. sed命令行格式为: sed [-nefri] ‘c ...

  4. cookie详解(含vue-cookie)

    今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9Ekm0u33w 原文如下,记录到此供以 ...

  5. 对于VS软件的个人评价

    因为还是一个菜鸟,对于VS这样的大软件还只能是自己个人的理解,以前用的是VC++,后来因为电脑系统更新,开始接触了VS,个人觉得还是vs2010更好用一些,作为一款windows平台应用程序的集成开发 ...

  6. 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度

    <Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...

  7. oracle加注释

    COMMENT ON table GC_G_DOC84 IS '行政处罚撤销决定书'; COMMENT ON column GC_G_DOC84.CASEID IS '案件记录ID';

  8. [转] Linux有问必答:如何修复“sshd error: could not load host key”

    编译自:http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html作者: GOLinux 本文地址:https://linux.cn/ ...

  9. [Wiki].NET框架

    .NET框架 建议将.NET Framework 3.0并入本条目或章节.(讨论)  .NET框架 .NET框架的组件堆栈 开发者 Microsoft 初始版本 2002年2月13日,​16年前 稳定 ...

  10. Wireshark协议分析工具应用

    一.Wireshark简介与安装 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用W ...