luogu P4342 [IOI1998]Polygon
IOI早期这么多dp?
题目要求断掉环上的一边,我们可以断环为链,开两倍数组
容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp
不过可能会有负数出现,这意味着可能区间中可能会有两个负数相乘得到最大值的情况,所以设\(g_{i,j}\)为区间\([i,j]\)的最小值
转移时记得考虑所有可能情况
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=100+10;
const LL inf=1e14;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
LL f[N][N],g[N][N],ans=-inf,an[N],a[N][2],tt;
int n,m;
int main()
{
n=rd();
for(int i=1;i<=n;i++)
{
char cc[2];
scanf("%s",cc);
a[i][1]=a[i+n][1]=(cc[0]=='t');
a[i][0]=a[i+n][0]=f[i][i]=f[i+n][i+n]=g[i][i]=g[i+n][i+n]=rd();
}
for(int l=1;l<=n-1;l++)
for(int i=1,j=i+l;j<(n<<1);i++,j++)
{
f[i][j]=-inf,g[i][j]=inf;
for(int k=i+1;k<=j;k++)
{
if(a[k][1])
f[i][j]=max(f[i][j],f[i][k-1]+f[k][j]),
g[i][j]=min(g[i][j],g[i][k-1]+g[k][j]);
else
f[i][j]=max(f[i][j],max(f[i][k-1]*f[k][j],g[i][k-1]*g[k][j])),
g[i][j]=min(g[i][j],min(f[i][k-1]*f[k][j],g[i][k-1]*g[k][j])),
g[i][j]=min(g[i][j],min(f[i][k-1]*g[k][j],g[i][k-1]*f[k][j]));
}
//printf("%d %d %lld %lld\n",i,j,f[i][j],g[i][j]);
}
for(int i=1;i<=n;i++)
if(ans<f[i][i+n-1]) ans=f[i][i+n-1],an[tt=1]=i;
else if(ans==f[i][i+n-1]) an[++tt]=i;
printf("%lld\n",ans);
for(int i=1;i<=tt;i++) printf("%lld ",an[i]);
return 0;
}
luogu P4342 [IOI1998]Polygon的更多相关文章
- P4342 [IOI1998]Polygon
题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...
- 洛谷 P4342 [IOI1998]Polygon
题目传送门 解题思路: 一道环形dp,只不过有个地方要注意,因为有乘法,两个负数相乘是正数,所以最小的数是负数,乘起来可能比最大值大,所以要记录最小值(这道题是紫题的原因). AC代码: #inclu ...
- IOI1998 Polygon [区间dp]
[IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...
- [IOI1998]Polygon(区间dp)
[IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...
- 【洛谷P4342】[IOI1998]Polygon
Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...
- 【洛谷 P4342】[IOI1998]Polygon(DP)
题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...
- POJ 1179 IOI1998 Polygon
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5472 Accepted: 2334 Description Polyg ...
- [IOI1998]Polygon
很早就看到这题了...但因为有个IOI标志,拖到现在才做 由于是以前在书上看到的,就没有想过其他算法,直接区间DP了... 方程式也挺好想的 跟我们平时做数学题求几个数乘积最大差不多 最大的*最大的 ...
- [IOI1998] Polygon (区间dp,和石子合并很相似)
题意: 给你一个多边形(可以看作n个顶点,n-1条边的图),每一条边上有一个符号(+号或者*号),这个多边形有n个顶点,每一个顶点有一个值 最初你可以把一条边删除掉,这个时候这就是一个n个顶点,n-2 ...
随机推荐
- ERP开源框架 + 二次开发平台 介绍
经历了多年软件开发,深受网络大侠们的资源共享才得以有所成绩, 本人主要是做企业ERP软件,一直有个感受,开发具体某个功能不难,但随着需求的增加,管理庞大的代码却成了最大的问题 而为企业管理所做的开发, ...
- 在Python中调用C++模块
一.一般调用流程 http://www.cnblogs.com/huangshujia/p/4394276.html 二.Python读取图像并传入C++函数,再从C++返回结果图像给Python h ...
- 牛客网练习赛7-D-无向图(bfs,链式前向星)
题意:中文题: 思路:就是找某个点距离其他点的距离,他给你很多点也无所谓.用一个dist[]数组,这个数组保存的是他给你的点到其他点的最短距离且标记的作用,然后bfs搜索就行了. 代码: #inclu ...
- Java递归删除目录下所有的txt文件
public static void delAllFile(File path) { if (!path.exists() || !path.isDirectory()) { //不是目录 retur ...
- Inside JVM 内存模型
Inside JVM 内存模型 来源 原文:https://blog.csdn.net/silentbalanceyh/article/details/4661230 参考:IBM开发中心文档,&l ...
- MT【54】一道二次函数问题的几何意义
[Rather less, but better.]----卡尔·弗里德里希·高斯(1777-1855) (2016诸暨质检18)已知$f(x)=x^2-a|x-1|+b(a>0,b>-1 ...
- 12 Zabbix Item类型之Zabbix JMX类型
点击返回:自学Zabbix之路 12 Zabbix Item类型之Zabbix JMX类型 JMX 全称是Java Management Extensions,即Java管理扩展.Java程序会开放一 ...
- react与react-router
路由在单页应用极其常见,不论是angularjs项目还是react项目,都有路由. 在react项目中使用路由,我们当然是全局安装react-router. 第一步: 第二步:创建几个要跳转到的页面 ...
- MQTT 及其 测试工具
协议说明书:https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/04-OperationalBehavior.html 官网提供了很多的broker模拟 ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...