二维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 }

 

posted on 2012-09-05 21:52  yumao  阅读(320)  评论(0编辑  收藏  举报

导航