zoukankan      html  css  js  c++  java
  • BZOJ2990 : [Ontak2010]Keyboard

    考虑从$(1,1)$开始搜索移动方案,每次移动坐标的变化量都是$2$。

    如果构成了环,那么环的周长肯定是偶数。

    考虑这个环一定要被若干个骨牌覆盖,且还有一个位置是空的。

    所以得出环的周长是奇数,矛盾,因此这个搜索不会搜出环,从而会得到一棵有根树。

    那么答案就是所有关键点加上根节点形成的虚树的边总长$ imes 2-$离根最远的关键点到根的距离,DP即可。

    时间复杂度$O(nm)$。

    #include<cstdio>
    const int N=75,M=1230;
    char s[N],a[N][N];
    int n,m,cnt,i,j,x,y,z,ans,id[N][N],is[M],g[M],nxt[M],v[M],f[M];
    inline bool check(char x){return x=='a'||x=='e'||x=='i'||x=='o'||x=='u'||x=='y';}
    void dfs(int x,int y,int z,int u){
      if(x<1||x>n||y<1||y>m)return;
      int o=id[x][y];
      v[o]=1;
      if(u)nxt[o]=g[u],g[u]=o;
      if(z!=2&&a[x][y+1]=='-')dfs(x,y+2,1,o);
      if(z!=1&&a[x][y-1]=='-')dfs(x,y-2,2,o);
      if(z!=4&&a[x+1][y]=='|')dfs(x+2,y,3,o);
      if(z!=3&&a[x-1][y]=='|')dfs(x-2,y,4,o);
    }
    void dp(int x){
      for(int i=g[x];i;i=nxt[i]){
        dp(i);is[x]+=is[i];
        if(is[i]){
          ans+=2;
          if(f[i]>=f[x])f[x]=f[i]+1;
        }
      }
    }
    int main(){
      scanf("%d%d",&n,&m);
      for(i=1;i<=n;i+=2)for(j=1;j<=m;j+=2)id[i][j]=++cnt;
      for(i=1;i<=n;i++)for(scanf("%s",s+1),j=1;j<=m;j++)is[id[i][j]]|=check(s[j]);
      for(i=1;i<=n;i++)scanf("%s",a[i]+1);
      dfs(1,1,0,0);
      for(i=0;i<=cnt;i++)if(is[i]&&!v[i])return puts("NIE"),0;
      dp(1);
      return printf("%d",ans-f[1]),0;
    }
    

      

  • 相关阅读:
    OCP-1Z0-053-V12.02-69题
    OCP-1Z0-053-V12.02-170题
    OCP-1Z0-053-V12.02-117题
    OCP-1Z0-053-V12.02-222题
    OCP-1Z0-053-V12.02-528题
    OCP-1Z0-053-V12.02-531题
    OCP-1Z0-053-V12.02-532题
    OCP-1Z0-053-V12.02-533题
    OCP-1Z0-053-V12.02-542题
    OCP-1Z0-053-V12.02-68题
  • 原文地址:https://www.cnblogs.com/clrs97/p/5668016.html
Copyright © 2011-2022 走看看