zoukankan      html  css  js  c++  java
  • Home on the Range USACO 3.3 (dp阵亡)

    直接搜肯定过不去,后来看到题解别人按他的思路搜索无剪枝也能过,试了下结果还是不行,不过思路倒是不错,每个点若2x2满足

    要看3x3只用看额外加入的一行一列。

    官方题解好像是dp,状态方程 dp[i][j]=min(dp[i+1][j],dp[i][j+1],dp[i+1][j+1])+1;

    G[i+1][j] , G[i][j+1] , G[i+1][j+1]分别为(i,j)向下、向右、向右下一格的状况。 在(n-1,n-1)当且仅当三者都为1的时候,正方形才能扩充。从最右下向上,依次扩充即可

    按照这个思路写了个

      1 /*
      2 
      3 ID: hubiao cave
      4 
      5 PROG: range
      6 
      7 LANG: C++
      8 
      9 */
     10 
     11 
     12 
     13 
     14 #include<iostream>
     15 
     16 #include<fstream>
     17 
     18 #include<string>
     19 
     20 using namespace std;
     21 
     22 
     23 int min3(int,int,int);
     24 int farm[252][252];
     25 int f[252];
     26 int num;
     27 int counter(int);
     28 int main()
     29 
     30 {
     31 
     32     ifstream fin("range.in");
     33     ofstream fout("range.out");
     34 
     35     fin>>num;
     36     for(int i=0;i<num;i++)
     37         for(int j=0;j<num;j++)
     38     {
     39         char ch;
     40         fin>>ch;
     41         farm[i][j]=ch-'0';
     42     }
     43 
     44     for(int i=num-2;i>=0;i--)
     45         for(int j=num-2;j>=0;j--)
     46     {
     47         if(farm[i][j])
     48             farm[i][j]=min3(farm[i+1][j],farm[i][j+1],farm[i+1][j+1])+1;
     49         if(farm[i][j]>1)
     50             for(int m=2;m<=farm[i][j];m++)
     51                 f[m]++;
     52 
     53     }
     54     for(int i=2;i<=num;i++)
     55     {
     56         if(f[i]>0)
     57         fout<<i<<" "<<f[i]<<endl;
     58 
     59     }
     60 
     61 
     62     
     63     return 0;
     64 
     65 
     66 }
     67 
     68 int counter(int r)
     69 {
     70     int t=0;
     71     for(int i=0;i<num-r+1;i++)
     72         for(int j=0;j<num-r+1;j++)
     73     {
     74         if(farm[i][j]!=1)
     75             continue;
     76         int ti=i;
     77         int tj=j;
     78 
     79         while(max(ti,tj)+1<num&&farm[ti+1][tj+1])
     80         {
     81             tj++,ti++;
     82             int flag=false;
     83             for(int m=j;m<=tj;m++)
     84                 if(!farm[ti][m])
     85                 {
     86                     flag=true;
     87                     break;
     88                 }
     89             if(!flag)
     90             {
     91                 for(int m=i;m<=ti;m++)
     92                     if(!farm[m][tj])
     93                     {
     94                         flag=true;
     95                         break;
     96                     }
     97             }
     98             else
     99                 break;
    100             if(flag)
    101                 break;
    102             else
    103                 f[ti-i+1]++;
    104         }
    105     }
    106 return 0;
    107 }
    108 
    109 int min3(int a,int b,int c)
    110 {
    111     return min(c,min(a,b));
    112 }
  • 相关阅读:
    【机器学习基础】02、matplotlib基本01
    HIVE学习笔记
    实时数仓项目-01实时模块搭建
    net_framework-EF CodeFirst
    一些前端知识的小记
    .netcore-FreeSql的使用-搭建context
    netcore配置文件与发布
    .netcore与vue的学习笔记001
    .net项目的mvc简单发布
    .net中的SelectList在Html.DropdownList中的使用
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3372552.html
Copyright © 2011-2022 走看看