• 引水入城


    引水入城

    挺好的题..

    首先可以思考到将第一行每一个点作为bfs的起点找出他能到的干旱地区,之后就想着状压...结果发现500根本压不下来...

    那我们就要找点性质让我们可以DP....

    之后就知道了每一个水库覆盖着干旱地区一定是连续的区间,因为如果连续,就一定会有交叉,之后就可以被一个水库代替...

    这样我们就可以轻松DP了....

    dp貌似可以线段树优化,管它呢,反正总复杂度O(n^3)了,就暴力DP吧..

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=510;
    int h[N][N],n,m,dx[5]={-1,1,0,0},dy[5]={0,0,-1,1},f[N];
    struct node{int l,r;}a[N];
    bool vis[N][N];
    inline int read()
    {
        int x=0,ff=1;
        char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
        while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        return x*ff;
    }
    inline bool cmp(node x,node y) {return x.l<y.l;}
    inline void bfs(int x,int y)
    {
        queue<pair<int,int> >q;
        memset(vis,0,sizeof(vis));
        if(x==0&&y==0)
        {
            for(int i=1;i<=m;++i)
            {
                vis[1][i]=1;
                q.push({1,i});
            }
        }
        else vis[x][y]=1,q.push({x,y});
        while(!q.empty())
        {
            int t1=q.front().first;
            int t2=q.front().second;q.pop();
            for(int i=0;i<4;++i)
            {
                int xx=t1+dx[i];
                int yy=t2+dy[i];
                if(xx<1||xx>n||yy<1||yy>m) continue;
                if(h[xx][yy]<h[t1][t2]&&!vis[xx][yy]) 
                {
                    vis[xx][yy]=1;
                    q.push({xx,yy});
                }
            }
        }
    }
    int main()
    {
        freopen("1.in","r",stdin);
        n=read();m=read();
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j) h[i][j]=read();
        bfs(0,0);
        int cnt=0;
        for(int i=1;i<=m;++i) if(vis[n][i]) cnt++;
        if(cnt!=m) {printf("%d
    %d",0,m-cnt);return 0;}
        for(int i=1;i<=m;++i)
        {
            bfs(1,i);
            for(int j=1;j<=m;++j) 
                if(vis[n][j])
                {
                    if(!a[i].l) a[i].l=a[i].r=j;
                    else a[i].r=j;
                } 
        }
        sort(a+1,a+m+1,cmp);    
        memset(f,0x3f,sizeof(f));
        f[0]=0;
        for(int i=1;i<=m;++i) 
        {
            if(a[i].l>=1)
            for(int j=a[i].l-1;j<a[i].r;++j) f[a[i].r]=min(f[a[i].r],f[j]+1);
        }
        printf("%d
    %d",1,f[m]);
        return 0;
    }
    View Code
  • 相关阅读:
    常量的定义
    二进制、八进制、十进制、十六进制间的转换
    使用简单的 5 个步骤设置 Web 服务器集群
    新手推荐:IIS+PHP+MYSQL环境配置教程
    windows7 iis安装与配置
    web服务器配置方法
    如何配置web服务器
    系统没有“internet信息服务(IIS)管理器”
    Html 内嵌 选择器属性 Dom操作 JavaScript 事件
    <转载>使用css让大图片不超过网页宽度
  • 原文地址:https://www.cnblogs.com/gcfer/p/12435259.html
Copyright © 2020-2023  润新知