HDU 1559 最大子矩阵 (DP)
2016-03-02 10:41
417 查看
题目地址:HDU 1559
构造二维前缀和矩阵。即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和。然后枚举每一个矩阵的左上方的点。因为矩阵的长和宽是固定的,那么这个矩阵实际上也已经固定了。此时这个矩阵的和用公式:
sum=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1];
取最大值就能够了。
代码例如以下:
构造二维前缀和矩阵。即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和。然后枚举每一个矩阵的左上方的点。因为矩阵的长和宽是固定的,那么这个矩阵实际上也已经固定了。此时这个矩阵的和用公式:
sum=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1];
取最大值就能够了。
代码例如以下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; #define LL __int64 LL a[1001][1001]; int main() { int t, n, m, i, j, k, x, y; LL z, max1; scanf("%d",&t); while(t--) { max1=-1; scanf("%d%d%d%d",&n,&m,&x,&y); memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%I64d",&z); a[i][j]=a[i][j-1]+z; } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { a[i][j]+=a[i-1][j]; } } for(i=1;i<=n-x+1;i++) { for(j=1;j<=m-y+1;j++) { z=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1]; if(max1<z) max1=z; } } printf("%I64d\n",max1); } return 0; }
相关文章推荐
- FileStream StreamWriter StreamReader BinaryReader
- 齐次表示
- 使用BroadcasterRecevier拦截系统短信息_使用service后台获取位置信息
- iOS获取设备型号、设备类型等信息
- gdb时发出SIGTRAP信号的处理
- 【leetcode】【70】Climbing Stairs
- 常用oracle 数据库查询 重要!!
- JavaScript对浮点小数运算结果不精确bug的解决办法
- 【理解】 iOS沙盒(sandbox)机制(一)
- C#递归遍历树节点并且存储
- [转]how to split the ng-repeat data with three columns using bootstrap
- SQL 查询每个人第一次考试成绩
- UVA Arif in Dhaka (First Love Part 2) 10294 (polya定理)
- Python爬虫入门六之Cookie的使用
- Android AutoLayout全新的适配方式 堪称适配终结者
- Lightmap 色差、丢失|内存泄露...
- java中关于子类实例化时调用父类无参构造方法的问题
- 使用WinHttp实现POST方式用户模拟登录网站
- Nagios+NRPE安装备忘录(二)
- C++基础总结(3)--复杂数据类型