[IOI1998]Polygon
很早就看到这题了...但因为有个IOI标志,拖到现在才做
由于是以前在书上看到的,就没有想过其他算法,直接区间DP了...
方程式也挺好想的
跟我们平时做数学题求几个数乘积最大差不多
最大的*最大的
最小的*最小的(可能是负数)
这样两种情况
由于求最大中要用到最小值,我们在维护最大同时维护最小
最小的*最小的
最小的*最大的
也是两种情况
再考虑加法
最大:最大+最大
最小:最小+最小
各有一种情况
Tip 上面所述的类似于最大*最大都是左区间最大/小 和右区间最大/小
表达起来大概是这样的
for(int len=2;len<=n;++len){
for(int i=1;i+len-1<=2*n;++i){
int j=i+len-1;
for(int k=i;k<j;++k){
if(opt[k+1]=='x')
cmax(dpd[i][j],dpd[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]),
cmin(dpx[i][j],dpd[i][k]*dpx[k+1][j],dpx[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]);
else
cmin(dpx[i][j],dpx[i][k]+dpx[k+1][j]),
cmax(dpd[i][j],dpd[i][k]+dpd[k+1][j]);
}
}
}
最后的代码
#include<cstdio>
#include<iostream>
#include<cstring>
#define inf (0x7fffffff)
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=0,f=1;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
return ans*f;
}void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}int n,a[155],dpx[155][155],dpd[155][155],ans=-inf;char opt[55];
inline void cmin(int &a,int b){if(b<a) a=b;}
inline void cmin(int &a,int b,int c){cmin(a,b),cmin(a,c);}
inline void cmin(int &a,int b,int c,int d){cmin(a,b,c),cmin(a,d);}
inline void cmax(int &a,int b){if(a<b)a=b;}
inline void cmax(int &a,int b,int c){cmax(a,b),cmax(a,c);}
int main(){
n=read();
for(register int i=1;i<=n;++i) cin>>opt[i]>>a[i];
for(register int i=1;i<=n;++i) opt[i+n]=opt[i],a[i+n]=a[i];
for(int i=1;i<=n*2;++i)
for(int j=1;j<=n*2;++j)
(i==j)?(dpx[i][i]=dpd[i][i]=a[i]):(dpd[i][j]=-inf,dpx[i][j]=inf);
for(int len=2;len<=n;++len){
for(int i=1;i+len-1<=2*n;++i){
int j=i+len-1;
for(int k=i;k<j;++k){
if(opt[k+1]=='x')
cmax(dpd[i][j],dpd[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]),
cmin(dpx[i][j],dpd[i][k]*dpx[k+1][j],dpx[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]);
else
cmin(dpx[i][j],dpx[i][k]+dpx[k+1][j]),
cmax(dpd[i][j],dpd[i][k]+dpd[k+1][j]);
}
}
}
for(int i=1;i<=n;++i) cmax(ans,dpd[i][i+n-1]);writeln(ans);
for(int i=1;i<=n;i++) if(dpd[i][i+n-1]==ans) writep(i);
return 0;
}
[IOI1998]Polygon的更多相关文章
- IOI1998 Polygon [区间dp]
[IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...
- [IOI1998]Polygon(区间dp)
[IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...
- POJ 1179 IOI1998 Polygon
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5472 Accepted: 2334 Description Polyg ...
- 【洛谷P4342】[IOI1998]Polygon
Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...
- P4342 [IOI1998]Polygon
题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...
- luogu P4342 [IOI1998]Polygon
IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...
- 【洛谷 P4342】[IOI1998]Polygon(DP)
题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...
- 洛谷 P4342 [IOI1998]Polygon
题目传送门 解题思路: 一道环形dp,只不过有个地方要注意,因为有乘法,两个负数相乘是正数,所以最小的数是负数,乘起来可能比最大值大,所以要记录最小值(这道题是紫题的原因). AC代码: #inclu ...
- [IOI1998] Polygon (区间dp,和石子合并很相似)
题意: 给你一个多边形(可以看作n个顶点,n-1条边的图),每一条边上有一个符号(+号或者*号),这个多边形有n个顶点,每一个顶点有一个值 最初你可以把一条边删除掉,这个时候这就是一个n个顶点,n-2 ...
随机推荐
- C++字符串读入
int read() { ,f=;char ch=getchar(); ;ch=getchar();} +ch-';ch=getchar();} return x*f; } int main() { ...
- QQ5.0侧滑
package com.example; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; impo ...
- Ubuntu 16.04创建Swap分区或增加Swap分区容量(转)
要在Ubuntu中要创建Swap分区主要有如下2种方式: 一.传统创建方式 一般情况下,我们都会使用dd命令来预先创建交换分区文件,然后再用/dev/zero将该文件的内容全部置零,创建时还将用到bs ...
- pymongo collection.save 问题
项目中有这样一个需求,把路由器信息存入mongo,DB的结构如下: { router_name: name, router_ip: ip, interfaces: [ {oid:1,name:if1} ...
- list去掉重复元素
需求: 有list 里面含有重复元素,要求去掉重复元素: solution 1: >>> a [1, 2, 2, 1, 3, 4, 5, 6, 5] >>> set ...
- ubuntu12.04+cuda6.0+opencv2.4.9
更新了cuda之后,opencv的gpu模块又要重新编译了,这个地方有一个疑问,我对cuda6.0装了两次,第一次装好之后,没有配一个bumblebee,重装了cuda6.0之后,发现原来编译的ope ...
- js获取上传的文件名称
<input name="file_" type="file" id="file_" size="100" /&g ...
- CTO是有门槛的 我眼中真正优秀CTO应具备五大素质
最近几个月,不断有人找我推荐CTO人选,这两年互联网创业和创投实在是太火爆了,全民创业,创业项目井喷,一下子发现CTO不够用了,全行业缺CTO,到处都在找CTO.说实话,我自己也没有CTO存货,CTO ...
- 积累——SQLCommand命令
SQLcommand表示要对SQL数据库运行的一个 T-SQL 语句或存储过程.以便运行大量操作或处理数据库结构. 在对数据库訪问的时候,就经经常使用到这个.看看它是怎么做到的吧! 一.属性 Comm ...
- 消息驱动bean(MDB)实例
到眼下为止前面介绍的有关JavaEE的东西都是同步的.也就是说调用者调用某个方法.那么这种方法必须马上运行并返回运行结果. 用官方一些的语言来说就是"client通过业务接口调用一个方法,在 ...