二维DP 建房子
题目要求:
求最大正方形边长:
输入a[][];为1则可以建房,为0则不可建房,求可以建房的最大正方形边长。
子问题:dp[i][j] 表示以a[i][j]为左上角的正方形的最大边长。
Dp[i][j]=min{dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}+1
可以从最尾端开始。
最后的答案为dp[][]中的最大值。
代码实现:
View Code
1 #include<iostream> 2 using namespace std; 3 int dp[100][100]; //dp[i][j] means start by a[i][j],the largest square's side lenth 4 int a[100][100]; 5 int n,m; 6 int istrue(int x,int y){ 7 if(x>=1&&x<=n&&y>=1&&y<=m) 8 return true; 9 return false; 10 } 11 int main(){ 12 while(cin>>n>>m){ //the maxtri's lenth and wide 13 memset(dp,0,sizeof(dp)); 14 for(int i=1;i<=n;i++){ 15 for(int j=1;j<=m;j++){ 16 cin>>a[i][j]; //cin every points in maxtri's state 17 } 18 } 19 int max=0; 20 for(int k=n;k>=1;k--){ 21 for(int g=m;g>=1;g--){ 22 if(a[k][g]==0){ 23 dp[k][g]=0; 24 } 25 else{ 26 if(istrue(k+1,g)){ 27 dp[k][g]=dp[k+1][g]; 28 } 29 if(istrue(k,g+1)){ 30 dp[k][g]=dp[k][g+1]<dp[k][g]?dp[k][g+1]:dp[k][g]; 31 } 32 else 33 dp[k][g]=0; 34 if(istrue(k+1,g+1)){ 35 dp[k][g]=dp[k][g]<dp[k+1][g+1]?dp[k][g]:dp[k+1][g+1]; 36 } 37 else 38 dp[k][g]=0; 39 dp[k][g]++; 40 if(max<dp[k][g]) 41 max=dp[k][g]; 42 } 43 } 44 } 45 //cout<<dp[1][2]<<" "<<dp[2][1]<<" "<<dp[2][2]<<endl; 46 cout<<max<<endl; 47 } 48 return 0; 49 }