ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poj 1179 Polygon(断环成链)

2019-06-10 19:52:01  阅读:274  来源: 互联网

标签:ch Polygon min int res 断环成 su poj include


Polygon



\(solution:\)

这道题不做多讲,它基本上可以说是一道思维题、一道结论题。因为这道题的数据范围很小,自然总能想到断环成链。但这一题还有一个更重要的东西,他只涉及加法和乘法,我们在维护一段区间时其实只需要知道它的最大值和最小值即可,因为只有这两个对我们得出答案有用。但是这个其实是很难想到的,我能力有限,也讲不出我们应该如何才能看见这种题就想到这类结论,当时自己也是模模糊糊连蒙带猜搞出来的。



\(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;
}

标签:ch,Polygon,min,int,res,断环成,su,poj,include
来源: https://www.cnblogs.com/812-xiao-wen/p/10999736.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有