HDU 1559 最大子矩阵 (DP)
来源:互联网 发布:软件设计方案评审 编辑:程序博客网 时间:2024/05/17 07:31
题目地址: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];
取最大值就可以了。
代码如下:
#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 __int64LL 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;}
1 0
- hdu 1559【最大子矩阵和DP】
- hdu 1559 最大子矩阵(DP)
- HDU 1559 最大子矩阵(DP)
- HDU 1559 最大子矩阵 (DP)
- HDU-1559-最大子矩阵【DP】
- HDU 1559 最大子矩阵 (DP)
- HDU 1559 最大子矩阵和 (dp) 枚举+dp
- HDU 1559 最大子矩阵--dp--(最大和子矩阵模型)
- HDU:1559 最大子矩阵(动态规划DP)
- HDU 1559 最大子矩阵 (给定大小) DP
- HDU 1505 DP 最大完全子矩阵
- hdu 4328 最大子矩阵(DP)
- HDU 1506 DP 最大完全子矩阵
- HDU 2870 DP 最大完全子矩阵
- HDU 1506 dp求最大子矩阵 *
- #HDU 1506 dp求最大子矩阵
- #HDU 1505 dp 最大子矩阵
- #HDU 2870 dp最大子矩阵
- CP5 多维数组
- OpenGL调试头文件缺失
- Surrounded Regions
- HDU2586 How far away ?
- MFC单文档中添加类似OnCommand的Virtual函数
- HDU 1559 最大子矩阵 (DP)
- SD卡初始化以及命令详解
- 在Windows下安装Django
- 关闭触控板
- 开始,UML
- Java 线程面试问题
- c语言学习之day03
- 【瞎搞】 HDU 3101 The Heart of the Country
- HDU 5025 Saving Tang Monk 记忆化BFS+状态压缩