poj1050

i, j 代表列

用前缀和预处理出i,j之间的和

枚举i,j 那么i到j之间的和就相当于最长连续字段和的一位,对n行都做相同处理,再做一遍最长连续字段和即可。

最长连续字段和的 dp方程 dp[i] = max(dp[i-1] + a[i], a[i]);

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 int n, a[110][110], sum[110][110], tmp[110], dp[110], ans;
 6 int main()
 7 {
 8     scanf("%d", &n);
 9     for (int i = 1; i <= n; i++)
10         for (int j = 1; j <= n; j++)
11             scanf("%d", &a[i][j]);
12     for (int i = 1; i <= n; i++)
13         for (int j = 1; j <= n; j++)
14             sum[i][j] += sum[i][j-1] + a[i][j];
15     for (int i = 1; i <= n; i++)
16         for (int j = i; j <= n; j++){
17             memset(dp, 0, sizeof(dp));
18             for (int k = 1; k <= n; k++)
19             {
20                 tmp[k] = sum[k][j] - sum[k][i-1];
21             }
22             for(int l = 1; l <= n; l++)
23             {
24                 dp[l] = max(dp[l-1] + tmp[l], tmp[l]);
25                 if(dp[l] > ans)ans = dp[l];
26             }
27         }
28     printf("%d\n", ans);
29 }
时间: 2024-12-06 02:47:19

poj1050的相关文章

POJ1050:To the max

poj1050:http://poj.org/problem?id=1050 * maximum-subarray 问题的升级版本~ 本题同样是采用DP思想来做,同时有个小技巧处理:就是把二维数组看做一维数组.怎么去看呢,我们可以吧具有同样列号的数捆绑到一起,比如 a[1][1], a[2][1], a[3][1].....我们可以吧他们都看做 'a[1]'.因为最终的解是矩阵行数n中的任意一段,比如说:第p行到第q行, (1<=p<=q<=n), 我们要得到最终解,就一定要逐一枚举p,

最大子矩阵和问题poj1050

最大子矩阵和问题以POJ1050为例:给出一个矩阵,找出该矩阵的最大子矩阵和 例如: 0 -2 -7 0    9 2 -6 2 -4 1 -4 1 -1 8 0 -2 最大子矩阵为: 9 2 -4 1 -1 8 and has a sum of 15. 分析:首先,我们考虑一种极端的方法,如果这个数组a是一个一维数组,那么这个问题就转换成为了最大子段和问题:最大子段和b[i]=max(b[i-1]+a[i],a[i]),b[i]指的是0到i的最大子段和. #include <cstdio>

POJ1050 To the Max - 贪心[最大子矩阵和]

POJ1050 To the Max 传送门 题意: 给定一个\(n*n\)的带权矩阵,求一个矩阵,使矩阵内权值之和最大,输出这个矩阵的权值和.$n\leq100 $ 思路: 可以利用前缀和优化,然后\(O(n^4)\)枚举矩阵的左上角和右下角,求出最大二维前缀和. 这样的枚举方案比较难以再次优化,我们考虑矩阵权值和的实质:等价于我们将矩阵每列的权值加起来,形成一个新数列,然后对这个数列求和,而最大的矩阵权值和,相当于在矩阵上下边界不变的情况下使新数列的和最大,即新数列的最大子段和.所以换种枚举

[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

poj1050查找最大子矩阵和

题目: To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 48507   Accepted: 25662 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 locate

poj1050最大子矩阵和

这篇是看了别人的报告写的,就当是屡屡思路好了. 题目大意.给定一个n阶矩阵(方阵),每一个元素中存在一个数字.任务就是求出一个最大的子矩阵使得矩阵元素之间的和是最大的. n=100; 1.矩阵A[m][n]的和能够直接 sum+=A[i][j] ( i = 0 to n-1 j=0 to n-1); 还能够求出第i列的和p[i],再将所在列加起来,(当然行是同理的). 2.因此所选的矩阵的行k能够枚举(0<=k<=n-1),此时能够现将列加起来,然后找到这些列中连续最大和就可以.这就是选出的矩

URAL1146 &amp; POJ1050 Maximum Sum (最大连续子序列和)

Description Given a 2-dimensional array of positive and negative integers, find the sub-rectangle with the largest sum. 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

POJ1050 To the MAX 想法题

题意 给一个N*N的方阵,找出一个子矩阵,使子矩阵的和最大.(n<=100) 思路 一维的情况是经典的"最大连续和问题".我们考虑把二维的问题降到一维来.我们枚举最高的层和最低的层,把他们中间的值都加到一个tmp数组里,然后用tmp数组来做"最大连续和问题",不断更新ans.那么最后得出的ans一定是最大子矩阵. 代码 #include <cstdio> #include <algorithm> #include <cstring

最大子矩阵,最大连续子数组进阶,动态规划初级,poj1050

题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和. 例如: 这样的一个矩阵,最大子矩阵的和为15: 此题可以让人联想到求最大连续子数组,求最大子数组在上一篇文章中http://www.cnblogs.com/tz346125264/p/7560708.html. 分析:最大子矩阵可以看为求最大连续子数组拓展到二维数组上,因为矩阵的性质同样在横向竖向上需要连续,那么可以想办法将这个二维数组简化为求连续子数组. 思考: 1.要求最大子矩阵,必须保证每个矩阵都被浏览到,为了保证运行时间尽

[POJ1050]To the Max(最大子矩阵,DP)

题目链接:http://poj.org/problem?id=1050 发现这个题没有写过题解,现在补上吧,思路挺经典的. 思路就是枚举所有的连续的连续的行,比如1 2 3 4 12 23 34 45 123 234 345...然后把这些行对应列相加缩成一行,之后就是求最大子序列和了. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃