zoukankan      html  css  js  c++  java
  • ural1221. Malevich Strikes Back!

    http://acm.timus.ru/problem.aspx?space=1&num=1221

    算是枚举的 题目意思是必须划出这样的 11011

                      10001

                      00000

                      10001

                      11011

    注意中间必须是完整的0,不多不少,旁边的1也是如此 不多不少 才可以

    题目很简单 预处理出1的个数 以及以当前0为最低顶角的最大正方形的边长 判断一下1的个数是否满足就可

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 using namespace std;
     9 int a[110][110],dp[110][110],sum[110][110];
    10 int main()
    11 {
    12     int i,j,n,maxz,g;
    13     while(cin>>n)
    14     {
    15         if(!n) break;
    16         memset(sum,0,sizeof(sum));
    17         memset(dp,0,sizeof(dp));
    18         maxz=0;
    19         for(i = 1; i <= n ; i++)
    20         for(j = 1; j <= n ; j++)
    21         {
    22             cin>>a[i][j];
    23             if(a[i][j]==0) dp[i][j] = 1;
    24             sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
    25             if(a[i][j]==1) sum[i][j]++;
    26         }
    27         for(i = 2; i <= n ; i++)
    28             for(j = 2 ; j <= n ;j++)
    29             if(a[i][j]==0)
    30             {
    31                 int k = (min(dp[i-1][j],dp[i-1][j-1]),dp[i-1][j+1]);
    32                 if(i>=2*k+1&&a[i-2*k][j]==0)
    33                 dp[i][j] = k+1;
    34                 else
    35                 dp[i][j] = 1;
    36                 //cout<<dp[i][j]<<" "<<i<<" "<<j<<endl;
    37             }
    38         int b[110] = {0};
    39         b[1] = 1;
    40         for(i = 2; i <= 100 ; i++)
    41         b[i] = b[i-1]+4*(i-1);
    42         for(i =1; i <= n ; i++)
    43             for(j = 1; j <= n ;j++)
    44             {
    45                 if(a[i][j]==1)
    46                 {
    47                     int x=0;
    48                     for(g = j ; g >= 1 ; g--)
    49                     if(a[i][g]==0)
    50                     break;
    51                     else x++;
    52                     if(i<2*x+1||j<2*x+1) continue;
    53                     int s = sum[i][j]-sum[i-2*x-1][j]-sum[i][j-2*x-1]+sum[i-2*x-1][j-2*x-1];
    54                     //if(i==5&&j==5)
    55                     //cout<<dp[i][j-x]<<" "<<x<<" "<<sum[i][j]<<endl;
    56                     if(dp[i][j-x]==x+1&&s==(2*x+1)*(2*x+1)-b[x+1])
    57                     maxz = max(maxz,2*x+1);
    58                 }
    59             }
    60         if(maxz)
    61         cout<<maxz<<endl;
    62         else
    63         puts("No solution");
    64     }
    65 
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/shangyu/p/3537406.html
Copyright © 2011-2022 走看看