这种dp方法通常来解决最大子矩阵相关的问题
例题.1
题目要求的是正方形。。。。
水题。。。
复杂度是O(N*M)
#include<bits/stdc++.h>
#define MAXN 1000
using namespace std;
//记f(i,j)为以i,j为右下角的正方形的边长
int n,t,maxl;
int f[MAXN+5][MAXN+5];
bool tu[MAXN+5][MAXN+5];
void init(){
memset(tu , false , sizeof(tu));
cin>>n>>t;
for(int i = 1 ; i <= t ; i++){
int x , y ; cin>>x>>y;
tu[x][y] = true;
}
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
if(tu[i][j] == false)f[i][j] = 1;
else f[i][j] = 0;
}
}
}
void solve(){
for(int i = 1; i <= n ; i++){
for(int j = 1 ; j <=n ; j++){
if(tu[i][j] == true)continue;
int minl = MAXN*MAXN+5;
minl = min(minl , f[i-1][j]);
minl = min(minl , f[i][j-1]);
minl = min(minl , f[i-1][j-1]);
f[i][j] += minl;
maxl = max(maxl , f[i][j]);
//cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
}
}
cout<<maxl<<endl;
}
int main(){
init();
solve();
}
但如果出现别的限制的话就要考虑别的做法。。。
容易发现:
1.对于一个正