题目

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. 【面试题】ES6语法五之箭头函数

    ES6特性=>. function foo(x, y){ return x + y } var foo = (x, y) => x + y 包括一个参数列表(零个或多个参数,如果参数不是一 ...

  2. 【26期】如何判断一个对象是否存活?(或者GC对象的判定方法)?

    这个问题,面试被问到的概率还是很大的.以下关于 如何判断一个对象是否存活 的回答,完全参照<深入理解Java虚拟机>一书,有需要的可以看书学习.以下是题目解析 判断对象是否存活的算法包括: ...

  3. 跨域出现:XMLHttpRequest cannot load错误

    1.右击浏览器图标-->属性-->快捷方式-->目标栏添加--> --args --disable-web-security --user-data-dir 2.修改之后重新打 ...

  4. 卸载K8s集群及k8s命令自动补全

    一.配置命令自动补全 yum install -y bash-completion source /usr/share/bash-completion/bash_completion source & ...

  5. 接入GoogelAdmob C#服务器端验证 (SSV) 回调

    记一次接入谷歌广告验证 官方文档:https://developers.google.cn/admob/android/rewarded-video-ssv 需要httpserver进行验证,项目里有 ...

  6. 16.java八皇后问题

    问题描述:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 .同一列或同一斜线上,问有多少种摆法(92). 思路分析:1) 第一个皇后先放第一行第一列2) ...

  7. 4、Hadoop初识

  8. Linux内核红黑树2—移植笔记

    转自:https://www.cnblogs.com/hellokitty2/p/15362596.html 另外可参考:https://zhuanlan.zhihu.com/p/26599934 一 ...

  9. CIL指令和指针类型的操作

    对象引用的使用在CIL中受到严格限制.它们几乎完全被使用带有VOS(Virtual Object System)指令,这些指令是专门为处理对象和部分对象引用而设计的. 常规操作如下: 首先我们需要将加 ...

  10. 2022-11-19学习内容-Server端代码编写-Client端代码编写

    1.Server端代码编写 1.1UserDBHelper.java package com.example.chapter07_server.database; import android.con ...