二维DP 建房子

来源:互联网 发布:131458软件 编辑:程序博客网 时间:2024/06/09 15:08

 

题目要求:

              求最大正方形边长:

              输入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 wide13           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 state17                           }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                                else33                                     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                                else38                                     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 }

 

原创粉丝点击