Polygon



$ solution: $

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

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



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; inline int min(int x,int y){
if(x<y)return x;
return y;
}
inline int max(int x,int y){
if(x>y)return x;
return y;
} int n,t,m;
int a[105];
int ans[55];
bool b[105],s[105]; struct su{
int x,y;
inline void add(su i,su j){
x=max(x,i.x+j.x);
y=min(y,i.y+j.y);
}
inline void mul(su i,su j){
x=max(x,i.x*j.x);
x=max(x,i.y*j.y);
y=min(y,i.y*j.y);
y=min(y,i.x*j.y);
y=min(y,i.y*j.x);
}
}f[55][55]; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); char ch;
for(rg i=1;i<=n;a[n+i]=a[i]=qr(),++i)
cin>>ch,b[n+i]=b[i]=(ch=='x');
for(rg o=1;o<=n;++o){ t=0;
for(rg i=1;i<=n;++i)
for(rg j=1;j<=n;++j)
f[i][j].x=-inf,f[i][j].y=inf;
for(rg i=o;i<o+n;i++)
s[++t]=b[i+1],f[t][t].x=f[t][t].y=a[i];
for(rg l=1;l<n;++l){
for(rg i=1,j=i+l;j<=n;++i,++j){
for(rg k=i;k<j;++k){
if(s[k])f[i][j].mul(f[i][k],f[k+1][j]);
else f[i][j].add(f[i][k],f[k+1][j]);
}
}
}ans[o]=f[1][n].x; m=max(m,ans[o]);
}printf("%d\n",m);
for(rg i=1;i<=n;++i)
if(ans[i]==m)printf("%d ",i);
return 0;
}

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. 使用Unity做2.5D游戏教程(一)

    最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵. 如果你不了解2.5D游戏是什么,它基本上是个3D游戏而你可以想象是压扁的 ...

  2. 【bzoj4408】[Fjoi 2016]神秘数 主席树

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 = 4+1+1 ...

  3. 【CCF】交通规划 Dijstra变形 优先级队列重载

    [题意] 给定一个无向图,求这个图满足所有点到顶点的最短路径不变的最小生成树 [AC] 注意双向边要开2*maxm 注意优先级队列 参考https://www.cnblogs.com/cielosun ...

  4. 【树状数组区间修改单点查询】HDU 4031 Attack

    http://acm.hdu.edu.cn/showproblem.php?pid=4031 [题意] 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后 ...

  5. Java 学习(3):java 对象和类

    目录: --- 对象 --- 类 --- 源文件的声明规则 --- Java 包 对象: 对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种: ...

  6. Lucky and Good Months by Gregorian Calendar(poj 3393)

    大致题意: 科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识. 定义: Goog month : 该月第一个工作日为星期一的月份 Luckly mo ...

  7. 【POJ1226】Substrings(后缀数组,二分)

    题意: n<=10,len<=100 思路: 只有一个字符串的时候特判一下 #include<cstdio> #include<cstring> #include& ...

  8. treetable 用法小例

    插件地址:http://pan.baidu.com/s/1kVf0Kcfcript src="/plugins/jQuery/jQuery-2.1.4.min.js">< ...

  9. SLAVEOF以后

    当我们想要某个Redis服务器复制另一个服务器时,我们可以在连接这个Redis服务器的客户端上输入“SLAVEOF”命令指定另一个服务器的IP地址和端口号: SLAVEOF <master_ip ...

  10. saltstack 开发相关命令记录

    SALT API开发相关命令记录. 查看当前的salt key信息salt-key -L 测试被控主机的连通性salt '*' test.ping 远程命令执行测试salt '*' cmd.run ' ...