题目

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的更多相关文章

  1. 洛谷 P4342 [IOI1998]Polygon

    题目传送门 解题思路: 一道环形dp,只不过有个地方要注意,因为有乘法,两个负数相乘是正数,所以最小的数是负数,乘起来可能比最大值大,所以要记录最小值(这道题是紫题的原因). AC代码: #inclu ...

  2. 【洛谷P4342】[IOI1998]Polygon

    Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...

  3. 【洛谷 P4342】[IOI1998]Polygon(DP)

    题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...

  4. P4342 [IOI1998]Polygon

    题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...

  5. luogu P4342 [IOI1998]Polygon

    IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...

  6. 洛谷 P1856 【Picture】

    题目描述 N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上.它们的边都是垂直的或水平的.每个矩形可以部分或者全部覆盖其他矩形.所有的矩形组成的集合的轮廓称为周长.写一个程序计算 ...

  7. 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)

    题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  10. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. 解决MySQL5.5MySQLInstanceConfig最后一步setting报错

    问题描述 在安装过MySQL(或已卸载)的电脑中重新安装MySQL5.5, 在安装最后一项中Processing configuration中最后一项配置失败: 问题解决: 首先关于卸载: 安装时候若 ...

  2. 【面试必备】 【ES6】学Vue前必须掌握的内容(上)

    变量声明 采用 let 和 const 分别声明变量和常量. 不用var所以不存在变量提升. 解构 ① 数组解构[ ] 等号左边允许存在默认值.变量的取值按照顺序. //之前的写法 var arr=[ ...

  3. CentOS7 yum设置阿里源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  4. Gitlab Ubuntu部署

    一.安装存储库 sudo curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh ...

  5. MYSQL --存储引擎的对比

    主要介绍三种 InnoDB .MyISAM .Memory 一.InnoDB 介绍: InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后默认的存储引擎 特点: DML操作遵循 ...

  6. Python条件语句和基本数据类型

    1.if基本语句 if 条件: 内部代码块 else: ...... 2.if支持嵌套 if 1 == 1: if 2 == 2: print('走一步') else: print('走两步') el ...

  7. win10系统每次重启桌面图标排列都会改动怎么办

    鼠标右键点击个性化>主题>找到桌面图标设置>把计算机 回收站 用户的文件 控制面板 网络等前面框复选框全部勾选掉,然后在桌面新建文件夹把桌面所有的图标剪切到新建文件里面,然后把新建文 ...

  8. Delphi获取程序版本号

    参考: http://www.delphitop.com/html/hanshu/4627.html procedure GetVersionInfo(const FileName:string; v ...

  9. AI-Chat问答随笔

    Q: 操作系统和驱动的关系 A:操作系统和驱动程序是紧密相关的,它们一起构成了计算机系统中的软件部分,实现了对硬件资源的管理和控制.操作系统作为计算机系统的核心软件,主要负责管理和协调计算机系统中的各 ...

  10. (0619) 电脑 传 ipad