洛谷P4342 [IOI1998]Polygon
题目
https://www.luogu.com.cn/problem/P4342
我会做IOI题辣
思路
算法设计与分析的课堂例题。
首先这是一个环状DP,那么根据老套路,破环成链。发现要求的东西也很相关,就是求环从哪里断开可取到最优解,然后我们就可以很自信地接着往下做了。
考虑链的情况,是一个很裸的区间DP的形式。对区间[j,i],枚举中断点k,根据符号合并左右两段的结果即可。
比较坑的一点就是乘法。可以发现负数对乘法造成了很坏的影响,不能直接用最大值乘最大值。但是必然是极值乘极值。
于是可以同时维护一个区间的最小DP值和最大DP值,把4种组合方式都查一遍就得到正确的解了。
因为情况比较多,所以转移方程不好写,不过看代码应该就明白了。
代码
点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int num[200],op[200];
int dp[2][200][200];//dp[0][i][j]表示i~j区间得到的最小值,dp[1][i][j]表示最大值
int main(){
int i,j,n,m,k;
int x;
int ans=-inf;
char s[10];
scanf("%d",&n);
for(i=1;i<=2*n;++i){
if(i&1){
scanf("%s",s);
if(s[0]=='t') op[(i+1)/2]=1;
else op[(i+1)/2]=2;
}
else{
scanf("%d",&x);
num[i/2]=x;
}
}
for(i=n+1;i<=2*n;++i) num[i]=num[i-n];
for(i=n+1;i<=2*n;++i) op[i]=op[i-n];
for(i=1;i<=2*n;++i){
dp[1][i][i]=dp[0][i][i]=num[i];
for(j=i-1;j>=i-n+1&&j>=1;--j){
dp[1][j][i]=-inf;dp[0][j][i]=inf;
for(k=j;k<i;++k){
if(op[k+1]==1){
dp[1][j][i]=max(dp[1][j][i],dp[1][j][k]+dp[1][k+1][i]);
dp[0][j][i]=min(dp[0][j][i],dp[0][j][k]+dp[0][k+1][i]);
}
else{
dp[1][j][i]=max(dp[1][j][i],dp[1][j][k]*dp[1][k+1][i]);
dp[1][j][i]=max(dp[1][j][i],dp[1][j][k]*dp[0][k+1][i]);
dp[1][j][i]=max(dp[1][j][i],dp[0][j][k]*dp[1][k+1][i]);
dp[1][j][i]=max(dp[1][j][i],dp[0][j][k]*dp[0][k+1][i]);
dp[0][j][i]=min(dp[0][j][i],dp[0][j][k]*dp[0][k+1][i]);
dp[0][j][i]=min(dp[0][j][i],dp[1][j][k]*dp[0][k+1][i]);
dp[0][j][i]=min(dp[0][j][i],dp[0][j][k]*dp[1][k+1][i]);
dp[0][j][i]=min(dp[0][j][i],dp[1][j][k]*dp[1][k+1][i]);
}
}
}
}
for(i=1;i<=n;++i){
ans=max(ans,dp[1][i][i+n-1]);
}
printf("%d\n",ans);
for(i=1;i<=n;++i){
if(dp[1][i][i+n-1]==ans) printf("%d ",i);
}
// system("pause");
return 0;
}
洛谷P4342 [IOI1998]Polygon的更多相关文章
- 洛谷 P4342 [IOI1998]Polygon
题目传送门 解题思路: 一道环形dp,只不过有个地方要注意,因为有乘法,两个负数相乘是正数,所以最小的数是负数,乘起来可能比最大值大,所以要记录最小值(这道题是紫题的原因). AC代码: #inclu ...
- 【洛谷P4342】[IOI1998]Polygon
Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...
- 【洛谷 P4342】[IOI1998]Polygon(DP)
题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...
- P4342 [IOI1998]Polygon
题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...
- luogu P4342 [IOI1998]Polygon
IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...
- 洛谷 P1856 【Picture】
题目描述 N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上.它们的边都是垂直的或水平的.每个矩形可以部分或者全部覆盖其他矩形.所有的矩形组成的集合的轮廓称为周长.写一个程序计算 ...
- 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)
题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- 寒假acm训练第三周
这个题就是简单的数学思维 如果这个数组里全部都是10的倍数那直接计数达到n就直接出0 如果有其它不是10的倍数那找出最小的直接减去就可以了 下面就是代码 #include<iostream> ...
- Software--C#--grammer_Delegate--Event
2018-05-01 10:49:47 委托是一种类型,而事件是一个类或结构的成员,如同字段,属性.必须在类或结构中声明. 引申 - Observe 观察者模式 Publish/Subscribe ...
- 一条sql同时返回多个count结果
select * from (select alarm_content name, count(id) `count` from ai_alarm WHERE alarm_content IS NOT ...
- leecode76. 最小覆盖子串
76. 最小覆盖子串 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: ...
- BT做种
BT方式:BT方式属于P2P传输,客户机之间可互传数据,大大提高传输效率,推荐使用.此处以qBittorrent做种为示例,主要有以下几个要点1.启用内置Tracker(或用其他同类软件代替)2.启用 ...
- gulp安装出错
gulp安装出错 标签(空格分隔): gulp 贴上报错: [root@localhost web]# npm install gulp --save-dev gulptest@1.0.0 /mnt/ ...
- cython并行性能-计算滚动求和 rolling function
cython通过编译为C程序提高性能有很多例子,通过OpenMP并行的性能没那么多. 今天尝试了一下似乎gcc对parallelism reduction优化的很厉害,加上OpenMP并行可以提高20 ...
- java NIO原理和代码实践
一,先说java IO 1,线程阻塞:当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入. 2,面向流: 我们需要从流中读取一个或多个字节.它使用流来在数 ...
- Linux装cudnn
https://stackoverflow.com/questions/66977227/could-not-load-dynamic-library-libcudnn-so-8-when-runni ...
- Go语言的常用函数方法整理大全-实践总结
文章目录 前言 一.数据类型与相互转化 1.1 常用的数据类型 1.2 常用数据类型的转化 1.2.1 整形转字符串 1.2.2 字符串转整形 1.2.3 浮点转字符串 1.2.4 字符串转浮点 二. ...