标签:
这一个题就是问你在有树的格子农田里面最大的没有树的方格多大,这道题可以使用动态规划解决,定义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; //}
标签:
原文地址:http://www.cnblogs.com/xingxing1024/p/5183657.html