VIJOS P1057盖房子 (动态规划)
2013-11-27 21:10
330 查看
https://vijos.org/p/1057
【题意】在一个 n*m 的土地中 中有瑕疵的为0 完好的为1 其中最大的正方形无瑕疵土地 输出其边长。
【思路】d[i][j]为 以点 i j 为左上角的正方形最大的边长
显然要是a[i][j]=0 则d[i][j]=0
要是a[i][j]=1 则 d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1 ( 画一下图就知道了 )
【注意】for(j=m;j>=1;j--)
for(i=n;i>=1;i--) 这样才能保证在算d[i][j]时已经算出 d[i+1][j],d[i+1][j+1],d[i][j+1] 了
【题意】在一个 n*m 的土地中 中有瑕疵的为0 完好的为1 其中最大的正方形无瑕疵土地 输出其边长。
【思路】d[i][j]为 以点 i j 为左上角的正方形最大的边长
显然要是a[i][j]=0 则d[i][j]=0
要是a[i][j]=1 则 d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1 ( 画一下图就知道了 )
【注意】for(j=m;j>=1;j--)
for(i=n;i>=1;i--) 这样才能保证在算d[i][j]时已经算出 d[i+1][j],d[i+1][j+1],d[i][j+1] 了
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int a[1002][1002],d[1002][1002];//d[i][j]以i j 为左上角的顶点 int min(int a,int b,int c) { if(a<=b&&a<=c) return a; if(b<=a&&b<=c) return b; return c; } int main() { int i,j,n,m,t,k,q; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(d,0,sizeof(d)); int maxx=0; for(j=m;j>=1;j--) for(i=n;i>=1;i--) { if(a[i][j]==1) d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1; else d[i][j]=0; if(maxx<d[i][j]) maxx=d[i][j]; } } return 0; }
相关文章推荐
- |Vijos|动态规划|P1057 盖房子
- 【动态规划】 Vijos P1057 盖房子
- 【动态规划】Vijos P1011 清帝之惑之顺治
- Vijos P1407 古韵之刺绣(动态规划,01背包)
- Vijos P1143 三取方格数(动态规划,多进程DP)
- |Vijos|NOIP2012|动态规划|P1792 摆花
- vijos P2026 几乎奇偶等和数 [数位dp]【动态规划】
- 【动态规划】Vijos P1616 迎接仪式
- Vijos1057 盖房子(DP经典题)
- |Vijos|动态规划|P1025 小飞侠的游园方案
- vijos 1243 生产产品 单调性优化动态规划
- Vijos P1037 搭建双塔(动态规划)
- |Tyvj|NOIP2006|动态规划|P1057 金明的预算方案
- 【动态规划】【二分】【最长上升子序列】Vijos P1028 魔族密码
- Vijos P1218 数字游戏(动态规划,环形DP)
- vijos1057【动态规划】
- vijos1441 打鼹鼠 (动态规划)
- Vijos P1431 守望者的逃离 (动态规划+贪心)(未解决)
- 【动态规划】【最长公共子序列】Vijos P1111 小胖的水果
- Vijos P1037 搭建双塔(动态规划,二维背包)