【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\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的更多相关文章
- POJ1179 Polygon 区间DP
题目大意: 多边形游戏,有N个顶点的多边形,3 <= N <= 50 ,多边形有N条边,每个顶点中有一个数字(可正可负),每条边上或者是“+”号,或者是“*”号.边从1到N编号,首先选择一 ...
- POJ 1179 - Polygon - [区间DP]
题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...
- IOI1998 Polygon [区间dp]
[IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...
- IOI 98 (POJ 1179)Polygon(区间DP)
很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...
- poj1179多边形——区间DP
题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后 ...
- 【IOI1998】Polygon 区间DP
题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...
- [IOI1998] Polygon (区间dp,和石子合并很相似)
题意: 给你一个多边形(可以看作n个顶点,n-1条边的图),每一条边上有一个符号(+号或者*号),这个多边形有n个顶点,每一个顶点有一个值 最初你可以把一条边删除掉,这个时候这就是一个n个顶点,n-2 ...
- poj1179 环形+区间dp
因为要用到模,所以左起点设置为0比较好 #include<iostream> #include<cstdio> #include<cstring> #define ...
- 「IOI1998」「LuoguP4342」Polygon(区间dp
P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...
随机推荐
- vsftpd虚拟账户配置
1. 概述 FTP是文件传输协议,在内外网的文件传输中使用广泛. 本篇博客主要介绍FTP服务器的部署和测试. 2. 软件环境部署 查看系统是否安装FTP软件(vsftpd),执行命令:rpm -qa ...
- 阿里云Centos搭建jdk环境
当我们开始了自己的开发,那么云服务器是一定少不了的,当然也有很多同学只是在本地做开发研究. 这里记录一下我自己在阿里云上搭建环境的过程. 趁着优惠的时候,我在阿里云上购买了ECS云服务器,并且搭载了C ...
- Linux ip forward
Linux 默认带有 ip forward 功能,只不过因为各种原因,默认的配置把该功能关闭了.本文通过 demo 来演示 Linux 的 ip forward 功能,具体场景为:开启 Linux 的 ...
- Linux下批量ping某个网段ip的脚本
比如现在需要对172.16.50.0/24网段的ip进行检查,检查哪些ip现在被占用,哪些ip没有被占用,可以通过ping命令来检查,脚本如下: [root@uatdns01 opt]# vim /o ...
- Ceph分布式存储-运维操作笔记
一.Ceph简单介绍1)OSDs: Ceph的OSD守护进程(OSD)存储数据,处理数据复制,恢复,回填,重新调整,并通过检查其它Ceph OSD守护程序作为一个心跳 向Ceph的监视器报告一些检测信 ...
- 后台跑包方法 断开ssh程序也能继续执行的方法screen命令
aircrack-ng -w 字典路径 握手包路径 screen -S 001创建会话 screen -ls 列出窗口列表 screen -r 5位数字 进入会话指令 如果会话恢复不了,则是有可能 ...
- 《linux内核设计与实现》第五章
第五章 系统调用 一.与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层.作用: 为用户空间提供了一种硬件的抽象接口. 系统调用保证了系统的稳定和安全. 每个进程都运行在虚拟系统中,而在 ...
- 使用git命令创建分支到团队项目
背景 在我们的团队中,我作为管理者,创建了一个叫HelloWorld的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...
- QT应用在windows和Linux平台的发布指南
环境:QT5.4 Windows下Qt应用的发布 Qt安装路径为:C:\Qt\Qt5.4.0\5.4\mingw491_32\bin 首先确保这个路径不在环境变量中,否则可能不成功. 执行" ...
- Spring注解 开发