Polygon



$ solution: $

upd:还是多讲一下,这道题基本上可以说是一道思维题、一道结论题、一道考验你动态规划基本功是否扎实的题目。因为这道题的数据范围很小,思考一下总能想到断环成链的(因为去处环形后效性的方法就两个,一个是断环成链,另一个就是将环等效成两次线性DP,但是后者有条件)。然后,这一题还有一个更重要的东西,他只涉及加法和乘法(注意这里有乘法),当我们使用动态规划时应该要注意它需要能从阶段的最优性得到答案的最优结果!以前我们使用动态规划时权值往往维护一个最大或最小值即可,但这一题不一样。

因为这一道题它有乘法还有负数!所以如果我们动态规划维护的是最大值,我用它乘上一个负数,那它就直接变成了一个较小值!所以我们如果要最优子结构能转移到最优答案,这个子结构还需要维护一个最小值(因为两个小的负数相乘可以得到一个大正数)!所以这一题最大最小对我们得出答案都有用(而且只需要他们两个即可,较小值比不过最小值)。这是这一题最难以突破的一个地方,想到之后就是一道结论题了。



$ code: $

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<iomanip>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<ctime>
  8. #include<cmath>
  9. #include<vector>
  10. #include<queue>
  11. #include<map>
  12. #include<set>
  13. #define ll long long
  14. #define db double
  15. #define inf 0x7fffffff
  16. #define rg register int
  17. using namespace std;
  18. inline int min(int x,int y){
  19. if(x<y)return x;
  20. return y;
  21. }
  22. inline int max(int x,int y){
  23. if(x>y)return x;
  24. return y;
  25. }
  26. int n,t,m;
  27. int a[105];
  28. int ans[55];
  29. bool b[105],s[105];
  30. struct su{
  31. int x,y;
  32. inline void add(su i,su j){
  33. x=max(x,i.x+j.x);
  34. y=min(y,i.y+j.y);
  35. }
  36. inline void mul(su i,su j){
  37. x=max(x,i.x*j.x);
  38. x=max(x,i.y*j.y);
  39. y=min(y,i.y*j.y);
  40. y=min(y,i.x*j.y);
  41. y=min(y,i.y*j.x);
  42. }
  43. }f[55][55];
  44. inline int qr(){
  45. register char ch; register bool sign=0; rg res=0;
  46. while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
  47. while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
  48. return sign?-res:res;
  49. }
  50. int main(){
  51. //freopen(".in","r",stdin);
  52. //freopen(".out","w",stdout);
  53. n=qr(); char ch;
  54. for(rg i=1;i<=n;a[n+i]=a[i]=qr(),++i)
  55. cin>>ch,b[n+i]=b[i]=(ch=='x');
  56. for(rg o=1;o<=n;++o){ t=0;
  57. for(rg i=1;i<=n;++i)
  58. for(rg j=1;j<=n;++j)
  59. f[i][j].x=-inf,f[i][j].y=inf;
  60. for(rg i=o;i<o+n;i++)
  61. s[++t]=b[i+1],f[t][t].x=f[t][t].y=a[i];
  62. for(rg l=1;l<n;++l){
  63. for(rg i=1,j=i+l;j<=n;++i,++j){
  64. for(rg k=i;k<j;++k){
  65. if(s[k])f[i][j].mul(f[i][k],f[k+1][j]);
  66. else f[i][j].add(f[i][k],f[k+1][j]);
  67. }
  68. }
  69. }ans[o]=f[1][n].x; m=max(m,ans[o]);
  70. }printf("%d\n",m);
  71. for(rg i=1;i<=n;++i)
  72. if(ans[i]==m)printf("%d ",i);
  73. return 0;
  74. }

poj 1179 $Polygon$(断环成链)的更多相关文章

  1. P1880 [NOI1995]石子合并 区间dp+拆环成链

    思路 :一道经典的区间dp  唯一不同的时候 终点和起点相连  所以要拆环成链  只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...

  2. HDU 3966 & POJ 3237 & HYSBZ 2243 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  3. POJ 2763 Housewife Wind (树链剖分 有修改单边权)

    题目链接:http://poj.org/problem?id=2763 n个节点的树上知道了每条边权,然后有两种操作:0操作是输出 当前节点到 x节点的最短距离,并移动到 x 节点位置:1操作是第i条 ...

  4. hdu4714 Tree2cycle 把树剪成链

    题目是问把一棵树通过剪边.加边形成一个环的最小代价. 分成两步,先把树剪成一些链,再把链连接成一个环. 设一棵有n个节点的树,剪掉X条边后,形成L条链. 那么代价为X+L. n-1-X=edgeNum ...

  5. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  6. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  7. POJ 3237 Tree (树链剖分)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 2825   Accepted: 769 Description ...

  8. POJ 2763 Housewife Wind 树链拋分

    一.前言 这破题WA了一天,最后重构还是WA,最后通过POJ讨论版得到的数据显示,我看上去是把某个变量写错了..于是,还是低级错误背锅啊....代码能力有待进一步提升2333333 二.题意 某家庭主 ...

  9. poj 2763 Housewife Wind(树链拆分)

    id=2763" target="_blank" style="">题目链接:poj 2763 Housewife Wind 题目大意:给定一棵 ...

随机推荐

  1. iOS代理转移

    在控制器里面想调用一个视图的子视图的代理方法很简单 1.找到子视图的协议和代理属性 2.给你想调用的控件添加代理属性,遵守的协议和子视图的一样 3.重写代理属性的set方法

  2. 【Luogu】P1312Mayan游戏(暴搜)

    题目链接 由于是暴搜题,所以这篇博客只讲怎么优化剪枝,以及一些细节. 模拟消除思路:因为消除可以拆分成小的横条或竖条,而这些条的长度至少为三,所以一块可消除的区域至少会有一个中心点.这里的中心点可以不 ...

  3. 洛谷 [P3224] 永无乡

    Treap 的合并 首先感谢 @Capella 的DeBug 其次,这是由一个 & 号引发的血案 注意对于所有修改操作都要 & Treap的合并, 启发式合并,对于每一个节点都 ins ...

  4. Day 9 Linux samba & ngnix

    (摘) Samba服务 一.Samba简介  Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服 ...

  5. Delphi中的操作二进制文件的两个重要函数

    Delphi中的操作二进制文件的两个重要函数 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的 ...

  6. DBCP,C3P0与Tomcat jdbc pool 连接池的比较

    hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...

  7. 济南day1

    预计分数:100+100+30 实际分数:10+60+20 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8, ...

  8. htmlcxx取指定字段实例

    #include <string> #include <iostream> #include <sstream> #include <htmlcxx/html ...

  9. Android ZXing 二维码、条形码扫描介绍

    本帖最后由 Shims 于 2013-11-9 12:39 编辑 最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码 ...

  10. ScSPM

    Linear Spatial Pyramid Matching using Sparse Coding for Image Classification (CVPR'09) 稀疏编码系列: (一)-- ...