洛谷1387的进阶版,但很像。

1387要求是“全为1的正方形”,取dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))吧?这个有“只有对角线可以有1”的要求,取的是dp[i][j] = min(dp[i-1][j-1], min(s1[i-1][j], s2[i][j-1])),s1s2是预处理的两个数组,表示上方和左方有多少连续的0.另外本题左右方向对角线都算,所以得算两遍。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ;
int n, m, ans, a[maxn][maxn];
int s1[maxn][maxn], s2[maxn][maxn], dp[maxn][maxn]; int main() {
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf("%d", &a[i][j]);
}
} for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
if (!a[i][j]) {
s1[i][j] = s1[i-][j] + ;//up
s2[i][j] = s2[i][j-] + ;//left
} else {
dp[i][j] = min(dp[i-][j-], min(s1[i-][j], s2[i][j-])) + ;
ans = max(ans, dp[i][j]);
}
}
}
memset(dp, , sizeof dp);
memset(s2, , sizeof s2);
for (int i = ; i <= n; i++) {
for (int j = m; j; j--) {
if (!a[i][j]) s2[i][j] = s2[i][j+] + ;//right
else {
dp[i][j] = min(dp[i-][j+], min(s1[i-][j], s2[i][j+])) + ;
ans = max(ans, dp[i][j]);
}
}
} printf("%d\n", ans);
return ;
}

而我自己做时……我这种满脑子二分前缀和的暴力分子大概没救了吧~不过这两种做法时间和空间上相差不多,反而是暴力快一点(逃

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int n, m, ans;
int a[][], b[][], sum1[][], sum2[][], dp[][]; void DP(int a[][], int sum[][]) {
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
if (a[i][j]) {
auto ok = [](int i, int j, int tmp, int sum[][]) {
return sum[i][j] - sum[i - tmp][j] - sum[i][j - tmp] + sum[i - tmp][j - tmp] == tmp;
};
int l = , r = dp[(i - )&][j - ] + , t;
while (l <= r) {
int mid = (l + r) >> ;
if (ok(i, j, mid, sum)) {
t = mid;
l = mid + ;
} else r = mid - ;
}
dp[i&][j] = t;
} else dp[i&][j] = ;
ans = max(ans, dp[i&][j]);
}
}
} int main() {
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
scanf("%d", &a[i][j]);
b[i][m - j + ] = a[i][j];
}
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
sum1[i][j] = sum1[i - ][j] + sum1[i][j - ] - sum1[i - ][j - ] + a[i][j];
sum2[i][j] = sum2[i - ][j] + sum2[i][j - ] - sum2[i - ][j - ] + b[i][j];
}
DP(a, sum1);
memset(dp, , sizeof dp);
DP(b, sum2);
printf("%d\n", ans);
return ;
}

最新文章

  1. 【BZOJ-3270】博物馆 高斯消元 + 概率期望
  2. 模拟discuz发帖的类实现
  3. 获取http请求响应头
  4. BZOJ 2152: 聪聪可可 树分治
  5. jeos没有消亡,但看 debian 的 netinst .iso格式,那就是jeos的系统!
  6. 关于cocoa框架,你所要知道的一切(苹果官方文档,cocoa框架核心竞争力,必须收藏!)
  7. js一些问题总结
  8. Android Studio 使用genymotion 模拟器运行app时 提示找不到任何设备
  9. Java-马士兵设计模式学习笔记-观察者模式-模拟Awt Button
  10. 【openstack报错】【metadata问题】‘http://169.254.169.254/2009-04-04/meta-data/instance-id’ failed : url error [[Errno 111] Connection refused]
  11. linux c数据库备份第一版
  12. java中Timer计时器使用
  13. javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)
  14. Fastify 系列教程三 (验证、序列化和生命周期)
  15. SonarQube(代码质量管理)环境搭建
  16. Could not find default endpoint element that references contract &#39;wcfXXXXXXXXXXX&#39; in the ServiceMode
  17. 雷林鹏分享:jQuery EasyUI 数据网格 - 使用虚拟滚动视图显示海量数据
  18. [USACO4.2]Drainage Ditches
  19. python实战小程序之购物车
  20. python中的struct模块

热门文章

  1. 命令行下Android应用开发
  2. jQuery整理笔记九----功能性表格开发
  3. linux kfifo移植
  4. 提升自身的iOS编程水平 (转载)
  5. HDU 5651xiaoxin juju needs help
  6. 织梦栏目页分页title加&quot;第N页&quot;
  7. FileReader、 FileWriter、readLine()和newLine()、LineNumberReader(二十一)
  8. easyui 日期范围前后台的设置以及实现
  9. iOS--控制器加载自定义view的xib
  10. python-dev 安装错误