二维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 }
- 二维DP 建房子
- 建房子
- HDU2192建房子
- JavaScript趣题:建房子
- 【二维DP】最大子阵
- HDOJ-最大子矩阵(二维dp)
- 二维DP的最优子结构问题
- 用波音747飞机来……建房子
- HDU 2845 最大非连续子段和 二维dp
- HDU1081二维子数组最大和/压缩/动态规划/DP
- NYOJ 104 最大子矩阵(二维DP)
- [dp]poj1088_滑雪 二维形式的最长下降子序列
- dp求最大子段(一维数组,二维数组)
- nyoj36 最长公共子序列 【DP(二维)】
- NUC1776 Tiling Up Blocks【二维最长上升子序列+DP】
- hdu 1160 dp (二维最长上升子序列 记录路径
- 二维dp
- 【矩阵二维或三维dp】最大子矩阵,子矩阵快速求和(用到最大直方图)
- DP poj 2192
- 线段树的实现(求段和)
- 线段树优化 lazy算法 poj3468
- 云计算平台管理的三大利器Nagios、Ganglia和Splunk
- STl 中set的用法
- 二维DP 建房子
- 图论 最短路 poj 1062
- 0-1背包 系列问题
- 二分法 poj 1905
- 树状数组求最值 hdu 1754
- DAG图上单源最短路径 poj 3249
- floyd 求最小环 poj 1734
- STL实现全排列 next_permutation
- DFS poj 2488