hdu 1559最大子矩阵
来源:互联网 发布:专用发票数据导出 编辑:程序博客网 时间:2024/05/20 07:52
一直很少练dp~这几天再学学~~
在本题中:a[i][j]的值表示左上角为(1,1)右下角为(i,j)的矩阵的所有元素之和~
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。
Output
对于每组数据,输出一个整数,表示子矩阵的最大和。
Sample Input
14 5 2 23 361 649 676 588992 762 156 993 169662 34 638 89 543525 165 254 809 280
Sample Output
2474
#include <iostream>#include <string.h>#include <string>#include <stdio.h>#include <cmath>const int maxn=1010;using namespace std;int a[maxn][maxn];int main(){ int t,n,m,x,y; cin>>t; while(t--) { scanf("%d%d%d%d",&n,&m,&x,&y); memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) //将行叠加 for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); a[i][j]+=a[i][j-1]; } for(int i=1;i<=n;i++) //将列叠加,都叠加完之后,a[i][j]就表示左上角为(1,1)右下角为(i,j)的矩阵; for(int j=1;j<=m;j++) { a[i][j]+=a[i-1][j]; } //下面开始递推; int Max=a[x][y]; for(int i=x;i<=n;i++) for(int j=y;j<=m;j++) { if(i==x&&j==y)continue; if(i==x&&j!=y) { Max=max(Max,a[i][j]-a[i][j-y]); } else if(i!=x&&j==y) { Max=max(Max,a[i][j]-a[i-x][j]); } else if(i!=x&&j!=y) { Max=max(Max,a[i][j]-a[i][j-y]-a[i-x][j]+a[i-x][j-y]); } } cout<<Max<<endl; } return 0;}
0 0
- 最大子矩阵 hdu 1559
- HDU 1559 最大子矩阵
- HDU 1559 最大子矩阵
- HDU 1559 最大子矩阵
- hdu 1559 最大子矩阵
- HDU 1559 最大子矩阵
- HDU-1559最大子矩阵
- hdu 1559 最大子矩阵
- HDU 1559 最大子矩阵
- hdu 1559 最大子矩阵
- hdu 1559 最大子矩阵
- HDU 1559 最大子矩阵
- hdu 1559最大子矩阵
- HDU 1559 最大子矩阵
- HDU 1559 最大子矩阵
- HDU 1559 最大子矩阵
- HDU 1559 最大子矩阵
- hdu-1559 最大子矩阵
- LeetCode-Count and Say
- 海峡股份
- [ExtJS5学习笔记]第十节 Extjs5新增特性之ViewModel和DataBinding
- 神挡杀神
- 从零开始学android<ListView数据列表显示组件.二十一.>
- hdu 1559最大子矩阵
- MySQL 重设root密码
- openfire中用email作用户名注册的解决方案
- 队列之链队列
- 2014.07
- PL/SQL 学习笔记
- Git-创建版本库
- oracle merge into 的用法详解+实例
- HDU1529 Cashier Employment