To the Max(矩阵压缩)

To the Max

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 2   Accepted Submission(s) : 2

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

4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1

8 0 -2

Sample Output

15

题解:dp问题善于把复杂问题简单化,过程异途同归;

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX(x,y)(x>y?x:y)
 4 const int INF=-0x3f3f3f3f;
 5 const int MAXN=110;
 6 int ans,N;
 7 void maxline(int *a){
 8     int sum=0;
 9     for(int i=1;i<=N;i++){
10     //    printf("%d ",a[i]);
11         if(sum>0)sum+=a[i];//保证sum+a[i]>a[i];
12         else sum=a[i];
13     //    printf("%d\n",sum);
14         ans=MAX(ans,sum);
15     }
16 }
17 int main(){
18     int s[MAXN],dp[MAXN],map[MAXN][MAXN];
19     while(~scanf("%d",&N)){
20         int temp;
21         ans=INF;
22         for(int i=1;i<=N;i++)
23             for(int j=1;j<=N;j++)
24                 scanf("%d",&map[i][j]);
25         for(int i=1;i<=N;i++){
26             for(int j=i;j<=N;j++){
27                 if(j-i)for(int k=1;k<=N;k++)
28                     map[i][k]+=map[j][k];
29                     maxline(map[i]);//这里是i代表每列从i行到j行的元素和
30             }
31         }
32         printf("%d\n",ans);
33     }
34     return 0;
35 }
时间: 2024-10-10 06:16:12

To the Max(矩阵压缩)的相关文章

hdu1081 To the max(dp 矩阵压缩)

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8947    Accepted Submission(s): 4323 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectang

C++实现矩阵压缩

C++实现矩阵压缩 转置运算时一种最简单的矩阵运算.对于一个m*n的矩阵M,他的转置矩阵T是一个n*m的矩阵,且T(i,j) = M(j,i). 一个稀疏矩阵的转置矩阵仍然是稀疏矩阵. 矩阵转置 方案一: 1将矩阵的行列值相互交换 2将每个原则中的i j 相互交换 3重新排列三元组之间的次序 这种方法实现比较简单,一次迭代交换i j 值. 然后就是两层循环进行排序操作了. 方案二 具体实心步骤: 1 迭代遍历,统计列中元素个数 2 由1的结果迭代计算每一列中元素起始位置 3 依据2中得到数据进行

矩阵压缩存储之三元组顺序表

形态: 实现: /***************************************** 稀疏矩阵的三元组顺序表存储表示 by Rowandjj 2014/5/3 ******************************************/ #include<IOSTREAM> using namespace std; #define MAXSIZE 12500//非零元个数的最大值 typedef int ElemType; typedef struct _DATA_

HDU1081_To The Max【矩阵压缩】

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8528    Accepted Submission(s): 4142 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectan

[Swust OJ 589]--吃西瓜(三维矩阵压缩)

题目链接:http://acm.swust.edu.cn/problem/589/ Time limit(ms): 2000 Memory limit(kb): 65535 Description 告诉你们一个好消息,Wraith前几天天得到一块西瓜,但是是长方体形的.... Wraith发现这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200). 现在Wrai

学习日志---矩阵表示及特殊矩阵压缩

矩阵类:二维数组实现!! 每一行看成一个一维数组,在放入几个集合里面即可: 用到random类,可以生产随机数,括号里是最大值: 矩阵类: public class MyMatrix {     int[][] matrix ;//矩阵数组 Random random =new Random() ;//随机数对象 //默认的构造方法,生成3*3的矩阵 public MyMatrix() {         //默认是3*3矩阵 matrix = new int[3][3]; //初始矩阵 for

[POJ1050]To the Max (矩阵,最大连续子序列和)

数据弱,暴力过 题意 N^N的矩阵,求最大子矩阵和 思路 悬线?不需要.暴力+前缀和过 代码 //poj1050 //n^4暴力 #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define N 105 #define INF 0x3fffffff using namespace std; int a[N][N]; int sum[N]; int ans; int

【矩阵压缩】 poj 1050

题意:给一个矩阵,里面有正负数,求子矩阵和的最大值 #include <iostream> #include <cstdio> #include <stdlib.h> #include <memory.h> using namespace std; int s[105][105],dp[105],n,temp[105]; int main() { // freopen("in.txt","r",stdin); cin&

矩阵压缩

下三角矩阵 A[10,5]在一维数组中的下标(下标从0开始,行优先) A[10,5]前面的元素个数:第1行——1个,第2行——2个,···,第9行——9个,第10行——4个(横着看,A[10,,5]-A[10,1]=4).共49个. A[10,5]的下标:0+49=49 A[10,5]在一维数组中的下标(下标从0开始,列优先) A[10,5]前面的元素个数:第1列——n个,第2列——n-1个,···,第4列——n-3个:第5列——5个(竖着看,A[10,5]-A[5,5]=5). A[10,5]