题意:现在有一个n*m的矩阵A,在A中找一个H*H的正方形,使得其面积最大且该正方形元素的和不大于 limit。

分析:开始以为是DP或者二维RMQ,其实用二分就可以做出来;

    在输入时构造元素和矩阵dp[][](即dp[i][j]为从(1,1)到(i,j)的矩形范围元素和);再在(0,min(m,n))范围内二分查找满足条件的最优解H;计算正方形内元素和的方法要掌握;

   注意二分时要避免出现L==M而死循环的情况。

代码如下:

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int maxn = ;
int m, n, lim;
int dp[maxn][maxn];
bool solve(int h)
{ for(int i = h; i <= n; i++)
{
for(int j = h; j <= m; j++)
{
if(dp[i][j]-dp[i-h][j]-dp[i][j-h]+dp[i-h][j-h] > lim) continue;
return true;
}
}
return false;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &m, &lim);
memset(dp, , sizeof(dp));
for(int i = ; i <= n; i++)
{
int tmp = ;
for(int j = ; j <= m; j++)
{
int x; scanf("%d", &x);
tmp += x;
dp[i][j] = dp[i-][j]+tmp;
}
} int H = min(n, m);
int L = , R = H;
int M;
while(L < R)
{
M = L+(R-L)/;
if(M == L) M++; //避免死循环
if(solve(M)) L = M;
else R = M-;
}
cout << L*L << endl;
}
return ;
}

最新文章

  1. 关于JS事件的几点总结
  2. java中使用poi导入导出excel文件_并自定义日期格式
  3. 解决虚拟机linux端mysql数据库无法远程访问
  4. Oracle Hint 用法
  5. JavaFX 2 Dialogs
  6. (转)webstorm快捷键
  7. [HMLY]11.MVVM架构
  8. CodeForces 703D Mishka and Interesting sum
  9. MySQL的SELECT ...for update
  10. Makefile持续学习二
  11. ES6的模块化规范和CommonJS的模块化规范的差异
  12. Python_简单三级菜单制作
  13. fabric使用
  14. Java集合源码学习(三)LinkedList
  15. poj 3348
  16. Oracle数据库基础入门《二》Oracle内存结构
  17. i==1 &amp;&amp; resolve()
  18. java使用Base64编码
  19. [UE4]制作视野图标
  20. JDK 8 中Lambda表达式的使用

热门文章

  1. Android实例-获取安卓手机WIFI信息(XE8+小米2)
  2. 几个代码片段-计算程序运行时间+获得当前目录+生成MD5
  3. properties.load(in); 引出的中文乱码问题
  4. CSS 背景图片的定位和缩放
  5. sql:[dbo].[smt_MES_RptProductDaily] 生产日报表
  6. Ext.tree.Panel Extjs 在表格中添加树结构,并实现节点移动功能
  7. C# WinForm控件、自定义控件整理(大全)
  8. 更新插件时提示“正在更新缓存”“正在等待jockey-backend退出”
  9. Android传感器编程带实例
  10. oc-02-NSLog使用