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 ...
随机推荐
- 转 PV、TPS、QPS 计算方法
PV.TPS.QPS是怎么计算出来的? QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计]QPS = 总请求数 ...
- 七牛云注册创建oss并配置自定义域名
1.登陆官网注册账号 有个人和企业两种,根据自己的情况进行注册 https://portal.qiniu.com/signup/choice 2.注册后要进行认证,不认证是没有免费空间给你使用的 3. ...
- jQuery筛选总结
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Django前端获取后端数据之前端自定义函数
在写网站的时候遇到了一个问题: Django在后端向前端传数据时,多数会使用dict字典来传送多个数据,但前端只能遍历,没有一个用key取到value值的方法可以直接使用 如果作为一个list传递到前 ...
- DeBruijin HDU - 2894(????????)
题意: 莫名其妙 看不懂..只能靠别人的题意混日子 a完就懂了 就是 POJ1392 不求第k个了 直接输出这个路径 emm ...就改了一下那个代码 #include <iostream ...
- 最小费用最大流spfa
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #d ...
- 洛谷 P4211 [LNOI2014]LCA 解题报告
[LNOI2014]LCA 题意 给一个\(n(\le 50000)\)节点的有根树,询问\(l,r,z\),求\(\sum_{l\le i\le r}dep[lca(i,z)]\) 一直想启发式合并 ...
- C++ 虚函数表解析 继承
C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父 ...
- 序列自动机—— [FJOI2016]所有公共子序列问题
序列自动机: 是一个处理子序列的自动机.就这样. 建造:(By猫老师:immoralCO猫) s[] next[][] memset(next[n], -, <<); for(int i ...
- “由于下列错误,Parallel port driver 服务启动失败”,注意了
最近在“事件查看器”中发现这么一个错误:“由于下列错误,Parallel port driver 服务启动失败”, 我到网上搜索了一下,发现很多网页上都说解决办法: 把HKEY_LOCAL_MACHI ...