hdu 1559 最大子矩阵
最大子矩阵
Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2904 Accepted Submission(s):
1457
Problem Description
给你一个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
1
4 5 2 2
3 361 649 676 588
992 762 156 993 169
662 34 638 89 543
525 165 254 809 280
Sample Output
2474
动态规划题:解这一题的关键是要把二维的数组化为一位数组。按照要求,我们可以把数组每连续的y列求和当做一列,然后就可以把这一列当做是一位数组求得所需的最大子序列和即为子矩阵的最大和。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define N 1005 5 int arr[N][N]; 6 7 int main() 8 { 9 int t, m, n, x, y; 10 int i, j, k, l, sum, max; 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d%d%d%d",&m,&n,&x,&y); 15 memset(arr,0,sizeof(arr)); 16 for(i=1; i<=m; i++) 17 for(j=1; j<=n; j++) 18 { 19 scanf("%d",&arr[i][j]); 20 arr[i][j] += arr[i][j-1]; //每一列等于前面所有列对应的和 21 } 22 sum = 0; 23 max = 0; 24 for(i=x; i<=m; i++) 25 { 26 for(j=1; j<=n-y; j++) 27 { 28 for(k=j; k<j+y; k++) 29 sum += (arr[k][i]-arr[k][i-x]); //括号里的所有可能得x列的和 30 if(sum>max) 31 max = sum; 32 sum = 0; 33 } 34 } 35 printf("%d\n",max); 36 } 37 return 0; 38 }
相似的题目还有杭电1081 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081