先考虑如何判定一个r*c的矩阵是否符合条件,容易发现左上角的点无法被别的矩阵砸到,要求左上角r*c的矩阵中不能超过最左上角的元素,之后同理不断枚举最上&最左的非0点,可以用差分来优化,复杂度为$o(n^{4})$(n和m同阶)
(然后加上一些整除、倒序枚举的剪枝就可以过了)
正解是这样的,枚举1*c的最大矩阵,枚举r*1的最大矩阵,r*c的矩阵即为答案(这个用差分维护)
为了证明这个的正确性,分为两部分考虑:
1.必要性,即r*c的矩阵合法可以推出1*c和r*1的矩阵合法,显然成立(用c次r*1的矩阵/r次c*1的矩阵即可)
2.充分性,即1*c和r*1的矩阵合法可以推出r*c的矩阵合法,考虑对于当前的左上角,竖着敲了x次,说明每一列都超过了x,那么必然会导致每一行都敲至少x,也就是对r*c的矩阵敲了x次
问题即得证,那么最终正解的复杂度为$o(n^{3})$(n和m同阶)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m,s,ans,a[105][105],b[105][105];
4 bool pd(int r,int c){
5 memcpy(b,a,sizeof(a));
6 for(int i=1;i<=n;i++)
7 for(int j=1;j<=m;j++)
8 if (b[i][j]){
9 if ((i+r-1>n)||(j+c-1>m))return 0;
10 int p=b[i][j];
11 for(int x=i;x<i+r;x++)
12 for(int y=j;y<j+c;y++)
13 if ((b[x][y]-=p)<0)return 0;
14 }
15 return 1;
16 }
17 int main(){
18 scanf("%d%d",&n,&m);
19 for(int i=1;i<=n;i++)
20 for(int j=1;j<=m;j++){
21 scanf("%d",&a[i][j]);
22 s+=a[i][j];
23 }
24 for(int i=n;i;i--)
25 for(int j=m;j;j--)
26 if ((s%(i*j)==0)&&(i*j>ans)&&(pd(i,j)))ans=i*j;
27 printf("%d",s/ans);
28 }

最新文章

  1. iOS开发 判断当前APP版本和升级
  2. 读 [The Root of Lisp]
  3. 移动端JD首页H5页面
  4. Swift:网络库Alamofire
  5. 2013 ACM-ICPC长沙赛区全国邀请赛——Bottles Arrangement
  6. 转:MVC 下导航超链接本页面高亮的一种解决方案
  7. apache开源项目--solr
  8. bzoj3407 [Usaco2009 Oct]Bessie&#39;s Weight Problem 贝茜的体重问题
  9. 软件工程师 Book
  10. redis常用命令及结构
  11. Mysql 系统表
  12. java中转译符用&quot;\\&quot;的几种特殊字符
  13. Redis热点Key发现及常见解决方案!
  14. 用vs2015 编译 web app ionic
  15. [转]std::set、自定义类型与比较函数
  16. 通过maven-war-plugin插件对war包分环境打包
  17. 关于函数strtok和strtok_r的使用要点和实现原理(二)【转】
  18. jmeter 使用ANT运行 设置自动停止时间
  19. [C语言] 数据结构-衡量算法的标准
  20. java代码----数据类型的转换-----int ---&gt;String

热门文章

  1. 无法解析的外部符号之_cvLoadImage,_cvCreateMat,_cvReleaseImage之类
  2. Go语言核心36讲(Go语言基础知识六)--学习笔记
  3. Kubernetes-Service介绍(二)-服务发现
  4. C++ 与 Visual Studio 2019 和 WSL(四)——库组件
  5. csh
  6. 小白自制Linux开发板 七. USB驱动配置
  7. spring security整合QQ登录
  8. 21.7.31 test
  9. 21.6.21 test
  10. 算法:数字推盘游戏--重排九宫(8-puzzle)