hdu - To The Max-1081 - 最大子矩阵 - 最大连续子序列和变形/动态规划
2017-08-24 17:22
375 查看
问题
Problem Description
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
Input
The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].Output
Output the sum of the maximal sub-rectangle.Sample Input
40 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2
Sample Output
15题解
思路
这是一道求子矩阵的最大和问题,由于数据给得比较小,n≤100,可以使用常规的O(N^3)的时间复杂度的算法解,枚举每一行以及该行下面的所有的行的和,时间复杂度为O(N^2),然后对压缩后的每一行进行dp,压缩完后的tem[i]就对应一维数组的连续子序列和问题,时间复杂度为线性的O(N),最后总的时间复杂度为O(N^3)一般的矩阵是二维的,我们要把它压缩为一维的。
即将一层层的数相加,压缩成一维的即可,我们遍历所有的压缩可能,就可以求子序列和的方法求出最大值。
dp的状态转移方程:dp[i] = MAX(dp[i-1] + tmp[i], dp[i])
AC代码
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; typedef long long LL; int a[105][105]; int dp[105],tmp[105]; int main() { int n; while(~scanf("%d",&n)){ for(int i=0;i<n;++i) for(int j=0;j<n;++j) scanf("%d",&a[i][j]); int maxn=-1e7; for(int i=0;i<n;i++){枚举每一行 memset(tmp,0,sizeof(tmp)); for(int t=i;t<n;t++){//求i及以下小矩阵最大值 for(int j=0;j<n;j++) tmp[j]+=a[t][j]; dp[0]=tmp[0]; for(int j=1;j<n;j++){ if(dp[j-1]>0) dp[j]=dp[j-1]+tmp[j]; else dp[j]=tmp[j]; if(dp[j]>maxn) maxn=dp[j]; } } } printf("%d\n",maxn); } return 0; }
相关文章推荐
- HDU 1081 To The Max(最大连续子序列和(二维))
- hdu 1081 To The Max(最大连续子序列推广到二维)
- HDU 1081 To The Max【DP】【最大子段矩阵求和】
- HDU-1081 To The Max -----求子矩阵最大和
- HDU-1081 To The Max 二维最大子序列和
- 暑期dp46道(20)HDOJ 1081 To the Max 最大连续子序列+暴力枚举
- hdu 1081 To The Max(暴力枚举+最大连续子数组和)
- hdu 1081 To The Max(矩阵中最大的和)
- hdu 1081 To The Max最大矩阵和(动态规划)
- HDU 1003 Max Sum && HDU 1081 To The Max 一维子串最大和& 二维矩阵最大和
- hdu 1081 To The Max(子矩阵最大和)
- hdu1081 To The Max--DP(最大子矩阵和)
- hdu-1081 To The Max (最大子矩阵和)
- HDU 1081 To The Max(最大子矩阵)
- HDU 1081 To The Max(最大子矩阵和)
- HDU 1081 To The Max(最大子矩阵和)
- dp - 最大子矩阵和 - HDU 1081 To The Max
- hdu 1081 To The Max(最大子矩阵和,dp)
- hdu 1081 To The Max(最大子矩阵和)
- HDU1081_To The Max【矩阵压缩】