很早就看到这题了...但因为有个IOI标志,拖到现在才做

由于是以前在书上看到的,就没有想过其他算法,直接区间DP了...

方程式也挺好想的

跟我们平时做数学题求几个数乘积最大差不多

最大的*最大的

最小的*最小的(可能是负数)

这样两种情况

由于求最大中要用到最小值,我们在维护最大同时维护最小

最小的*最小的

最小的*最大的

也是两种情况

再考虑加法

最大:最大+最大

最小:最小+最小

各有一种情况

Tip 上面所述的类似于最大*最大都是左区间最大/小 和右区间最大/小

表达起来大概是这样的

  1. for(int len=2;len<=n;++len){
  2. for(int i=1;i+len-1<=2*n;++i){
  3. int j=i+len-1;
  4. for(int k=i;k<j;++k){
  5. if(opt[k+1]=='x')
  6. cmax(dpd[i][j],dpd[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]),
  7. cmin(dpx[i][j],dpd[i][k]*dpx[k+1][j],dpx[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]);
  8. else
  9. cmin(dpx[i][j],dpx[i][k]+dpx[k+1][j]),
  10. cmax(dpd[i][j],dpd[i][k]+dpd[k+1][j]);
  11. }
  12. }
  13. }

最后的代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #define inf (0x7fffffff)
  5. #define writeln(x) write(x),puts("")
  6. #define writep(x) write(x),putchar(' ')
  7. using namespace std;
  8. inline int read(){
  9. int ans=0,f=1;char chr=getchar();
  10. while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
  11. while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
  12. return ans*f;
  13. }void write(int x){
  14. if(x<0) putchar('-'),x=-x;
  15. if(x>9) write(x/10);
  16. putchar(x%10+'0');
  17. }int n,a[155],dpx[155][155],dpd[155][155],ans=-inf;char opt[55];
  18. inline void cmin(int &a,int b){if(b<a) a=b;}
  19. inline void cmin(int &a,int b,int c){cmin(a,b),cmin(a,c);}
  20. inline void cmin(int &a,int b,int c,int d){cmin(a,b,c),cmin(a,d);}
  21. inline void cmax(int &a,int b){if(a<b)a=b;}
  22. inline void cmax(int &a,int b,int c){cmax(a,b),cmax(a,c);}
  23. int main(){
  24. n=read();
  25. for(register int i=1;i<=n;++i) cin>>opt[i]>>a[i];
  26. for(register int i=1;i<=n;++i) opt[i+n]=opt[i],a[i+n]=a[i];
  27. for(int i=1;i<=n*2;++i)
  28. for(int j=1;j<=n*2;++j)
  29. (i==j)?(dpx[i][i]=dpd[i][i]=a[i]):(dpd[i][j]=-inf,dpx[i][j]=inf);
  30. for(int len=2;len<=n;++len){
  31. for(int i=1;i+len-1<=2*n;++i){
  32. int j=i+len-1;
  33. for(int k=i;k<j;++k){
  34. if(opt[k+1]=='x')
  35. cmax(dpd[i][j],dpd[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]),
  36. cmin(dpx[i][j],dpd[i][k]*dpx[k+1][j],dpx[i][k]*dpd[k+1][j],dpx[i][k]*dpx[k+1][j]);
  37. else
  38. cmin(dpx[i][j],dpx[i][k]+dpx[k+1][j]),
  39. cmax(dpd[i][j],dpd[i][k]+dpd[k+1][j]);
  40. }
  41. }
  42. }
  43. for(int i=1;i<=n;++i) cmax(ans,dpd[i][i+n-1]);writeln(ans);
  44. for(int i=1;i<=n;i++) if(dpd[i][i+n-1]==ans) writep(i);
  45. return 0;
  46. }

[IOI1998]Polygon的更多相关文章

  1. IOI1998 Polygon [区间dp]

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

  2. [IOI1998]Polygon(区间dp)

    [IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...

  3. POJ 1179 IOI1998 Polygon

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5472   Accepted: 2334 Description Polyg ...

  4. 【洛谷P4342】[IOI1998]Polygon

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

  5. P4342 [IOI1998]Polygon

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

  6. luogu P4342 [IOI1998]Polygon

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

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

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

  8. 洛谷 P4342 [IOI1998]Polygon

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

  9. [IOI1998] Polygon (区间dp,和石子合并很相似)

    题意: 给你一个多边形(可以看作n个顶点,n-1条边的图),每一条边上有一个符号(+号或者*号),这个多边形有n个顶点,每一个顶点有一个值 最初你可以把一条边删除掉,这个时候这就是一个n个顶点,n-2 ...

随机推荐

  1. 最近编译POCO 库和 Boost库的笔记

    最近在编译POCO库和BOOST库 先讲一下编译POCO库,我编译的是1.9.0,过程相当曲折,要OPENSSL修改版本的,个OPENSSL在这里下载,如果你用一般未修改的OPENSSL 是编译不了, ...

  2. 洛谷 通天系列 P1760 P1757 P1759

    P1760 通天之汉诺塔 汉诺塔问题.一个高精乘单精解决 ans=2^n-1 /*by SilverN*/ #include<algorithm> #include<iostream ...

  3. 【BZOJ4591】超能粒子炮·改(Lucas定理,组合计数)

    题意: 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...

  4. 整体二分--BZOJ1901: Zju2112 Dynamic Rankings

    n<=10000个数有m<=10000个操作,1.询问一个区间的第k小的数:2.单点修改. 带修主席树. 整体二分. 整体二分的必要条件: #include<string.h> ...

  5. 第一个Spring程序(DI的实现)

    一,依赖注入:Dependency Injection(DI)与控制反转(IoC),不同角度但是同一个概念.首先我们理解一点在传统方式中我们使用new的方式来创建一个对象,这会造成对象与被实例化的对象 ...

  6. 对于事务ACID的理解

    ACID,即以下四点: 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性(Consistency) 事务前后数据的完整性必须保持一致 ...

  7. springboot application.properties

    verify if you have this items: @Bean public CommonsMultipartResolver multipartResolver() { CommonsMu ...

  8. mybatis association和collection标签怎么用

    <resultMap type="Bill" id="ResultBill"> <id property="id" col ...

  9. Win10還原成最乾淨的狀態

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  10. 笔记本电脑 联想 Thinkpad E420 无法打开摄像头怎么办

    1 计算机管理-右击USB视频设备(应该显示为黄色问号,表示驱动安装不成功),点击浏览计算机以查找驱动程序软件 2 选择"从计算机的设备驱动程序列表中选择",然后选择Microso ...