【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.每个顶点用整数标记,每个边用符 ...
随机推荐
- Spring RPC 入门学习(3)-插入Student对象
Spring RPC 向后台传递对象 1. 新建RPC接口:StudentInterface.java package com.cvicse.ump.rpc.interfaceDefine; impo ...
- Today
I'm facing the major enemy. The information. I don't know when I've been crazy about seeking informa ...
- 对PS的评价
Photoshop(简称:PS)是电脑上的图像处理软件:对于广大Photoshop爱好者而言,PS亦用来形容通过该类图形处理软件处理过的图片,即非原始.非未处理的图片:多数人对于这软件的了解仅限于“一 ...
- Linux内核分析作业 NO.6
进程的描述和进程的创建 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- Linux内核分析— —扒开系统调用的三层皮(上)
实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为int mkdir (const char *filename, ...
- github个人心得
github真难全是英语真费劲 以后要好好学习英语 https://github.com/huangjingyi/test
- HTML的input类型为hidden导致无法reset改字段的value问题
问题关键:根据HTML规范,hidden是非ui类元素,不接受用户处理.所以form的 reset并不影响它. http://stackoverflow.com/questions/6367793/w ...
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- github使用指南(2015年3月23日更新了本地创建仓库再推送到remote仓库的使用方法)
我是通过这个来学习的.个人愚笨,琢磨了半天,终于搞通了,醉了醉了,以前一直使用svn,用git确实有点水土不服.本文以如何使用git为主来展开,不涉及太多理论. git是分布式的版本管理.什么叫分布式 ...
- MSSQL约束【转】
为了减少数据冗余和使数据库内容变的严谨,MSSQL数据库里引入了关系和约束.我们平时做一些小程序,需要使用到MSSQL数据库的时候大多没有严格去规划一下数据库的设计,但是真正开发的时候需要你严格的进行 ...