题目

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. iOS中的三种定时器

    iOS中的三种定时器 NSTimer 一.背景 定时器是iOS开发中经常使用的,但是使用不慎会造成内存泄露,因为NSTimer没有释放,控制器析构函数dealloc也没有调用,造成内存泄露. 二.使用 ...

  2. SAP HANA:XS Job

    5.SAP HANA XS Job XS Job:定义重复执行的后台定期任务: 例如定时执行数据更新到Table的操作,需要使用到XS Job; SAP HANA XS Setting up Sche ...

  3. APP稳定性测试Monkey工具介绍

    一.Monkey工具简介 1.monkey的来源: Monkey是一个命令行工具,使用安卓调试桥(adb)来运行它,模拟用户:触摸屏幕.滑动Trackball.按键等随机事件流来对设备上的程序进行压力 ...

  4. git prior sync failed; rebase still in progress

    方案一: 将这个git直接删掉,rm common/ -rf 然后再回到项目根目录repo sync 方案二: git rebase --abort

  5. SpringBoot Circular view path错误

    在运行SpringBoot时报了这样一个错误 百度翻译是视图循环 搜索一下 原来是类上restcontroller写成了controller  对比一下两者 @Controller和@RestCont ...

  6. shm

    进程间共享内存访问及读写 目录 进程间共享内存访问及读写 1. 进程间共享内存相关linux_C函数 2. 进程间共享内存基本流程 3. demo code 1. 进程间共享内存相关linux_C函数 ...

  7. ENGG1340 Computer Programming II

    课程内容笔记,自用,不涉及任何 assignment,exam 答案 Notes for self use, not included any assignments or exams Module ...

  8. locust自定义负载策略。

    1.时间峰值策略 每运行一分钟启动100个用户,总运行时间为10分钟 class CustomShape(LoadTestShape): # 设置时限 time_limit = 600 # 设置产生率 ...

  9. Android中动态添加tab

    来源过于啰嗦,这里只有简化后的. 转载请注明出处  http://www.cnblogs.com/zaiyuzhong/p/add-tab-dynamic-in-android.html 建立对应的布 ...

  10. .Net最小工作线程对应用程序性能的影响

    这要从Asp.Net建立连接的机制说起,Asp.Net建立连接依赖于.Net线程池,线程池的大小决定了应用程序最多可以同时执行的请求数量.maxWorkerThreads最大工作线程,决定单个处理器最 ...