CodeForces 22B Bargaining Table 简单DP

题目很好理解,问你的是在所给的图中周长最长的矩形是多长
嗯用坐标(x1, y1, x2, y2)表示一个矩形,暴力图中所有矩形
易得递推式:(x1, y1, x2, y2)为矩形的充要条件为:

  1.  (x1, y1, x2, y2) 和 (x1, y1, x2, y2)为合法矩形,即全部为0
  2.  Point(x2, y2) 为 0

当然对X1 == X2这种特殊情况需要特殊判断一下。

Source Code:

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler

#include <stdio.h>

#include <iostream>

#include <fstream>

#include <cstring>

#include <cmath>

#include <stack>

#include <string>

#include <map>

#include <set>

#include <list>

#include <queue>

#include <vector>

#include <algorithm>

#define Max (a,b) (((a) > (b)) ? (a) : (b))

#define Min (a,b) (((a) < (b)) ? (a) : (b))

#define Abs (x) (((x) > 0) ? (x) : (-(x)))

#define MOD 1000000007

#define pi acos(-1.0)



using namespace std;



typedef long long           ll      ;

typedef unsigned long long  ull     ;

typedef unsigned int        uint    ;

typedef unsigned char       uchar   ;



template <class T> inline void checkmin (T &a,T b) { if (a > b) a = b; }

template <class T> inline void checkmax (T &a,T b) { if (a < b) a = b; }



const double eps = 1e-7      ;

const int N = 1              ;

const int M = 200000         ;

const ll P = 10000000097ll   ;

const int INF = 0x3f3f3f3f   ;



char a[30][30];

bool cc[30][30][30][30];

int n, m;



bool check(int x1, int y1, int x2, int y2){

    if(x1 >= 1 && x1 <= n){

        if(x2 >= x1 && x2 <= n){

            if(y1 >= 1 && y1 <= m){

                if(y2 >= y1 && y2 <= m){

                    return true;

                }

            }

        }

    }

    return false;

}



int main(){

    int i, j, k, t, numCase = 0;

    while(cin >> n >> m){

        memset(cc, 0, sizeof(cc));

        for(i = 1; i <= n; ++i){

            for(j = 1; j <= m; ++j){

                cin >> a[i][j];

            }

        }

        int ans = 1;

        for(int x1 = 1; x1 <= n; ++x1){

            for(int x2 = x1; x2 <= n; ++x2){

                for(int y1 = 1; y1 <= m; ++y1){

                    for(int y2 = y1; y2 <= m; ++y2){

                        if((x2 == x1 || check(x1, y1, x2 - 1, y2)) && (y2 == y1 || check(x1, y1, x2, y2 - 1)) && a[x2][y2] == '0'){

                            if((x2 == x1 || cc[x1][y1][x2 - 1][y2]) && (y1 == y2 || cc[x1][y1][x2][y2 - 1])){

                                cc[x1][y1][x2][y2] = true;

                                checkmax(ans, 2 * (x2 - x1 + 1 + y2 - y1 + 1));

                            }

                        }



                    }

                }

            }

        }

        cout << ans << endl;

    }



    return 0;

}

 

你可能感兴趣的:(codeforces)