USACO bigborn 最大矩形

  这一个题就是问你在有树的格子农田里面最大的没有树的方格多大,这道题可以使用动态规划解决,定义dp[i][j]为i j开始的最大方形的边长 那么dp[i][j] = min(dp[i+1][j], dp[i][j+1], dp[i+1][j+1]) + 1,  初识dp[i][j] = 0, 代码如下:

/*
    ID: m1500293
    LANG: C++
    PROG: bigbrn
*/
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
int tree[1002][1002];
int dp[2][1002];
int main()
{
    freopen("bigbrn.in", "r", stdin);
    freopen("bigbrn.out", "w", stdout);
    int N, T;
    scanf("%d%d", &N, &T);
    for(int i=0; i<T; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        tree[x][y] = 1;
    }
    int ans = 0;
    for(int i=N; i>=1; i--)
    {
        memset(dp[i%2], 0, sizeof(dp[0]));
        for(int j=N; j>=1; j--)
        {
            if(!tree[i][j])
            {
                int t1 = min(dp[i%2][j+1], dp[(i+1)%2][j]);
                int t2 = min(t1, dp[(i+1)%2][j+1]);
                dp[i%2][j] = t2+1;
            }
            ans = max(ans, dp[i%2][j]);
        }
    }
    printf("%d\n", ans);
    return 0;
}



///*
//    ID: m1500293
//    LANG: C++
//    PROG: bigbrn
//*/
//#include <cstdio>
//#include <algorithm>
//#include <cstring>
//
//using namespace std;
//int tree[1002][1002];
//int dp[1002][1002];
//int main()
//{
//    freopen("bigbrn.in", "r", stdin);
//    freopen("bigbrn.out", "w", stdout);
//    int N, T;
//    scanf("%d%d", &N, &T);
//    for(int i=0; i<T; i++)
//    {
//        int x, y;
//        scanf("%d%d", &x, &y);
//        tree[x][y] = 1;
//    }
//    int ans = 0;
//    for(int i=N; i>=1; i--)
//        for(int j=N; j>=1; j--)
//        {
//            if(!tree[i][j])
//            {
//                int t1 = min(dp[i][j+1], dp[i+1][j]);
//                int t2 = min(t1, dp[i+1][j+1]);
//                dp[i][j] = t2+1;
//            }
//            ans = max(ans, dp[i][j]);
//        }
//    printf("%d\n", ans);
//    return 0;
//}

 

你可能感兴趣的:(USACO bigborn 最大矩形)