`

POJ1050-To the Max-DP

 
阅读更多
参见《编程之美》2.14, 2.15 子数组和最大值(一维&二维)

转:POJ 2479/POJ 2593的拓展,从一维数组变成了二维矩阵,不过我们可以把情况模拟成一维的情况,在DP的基础上需要加上枚举。
题目要求求出给定的一个矩阵的和最大的子矩阵。

我们可以枚举第a行到第c行的情况(假设已经确定矩阵已经确定为最上面为第a行,最下面为第c行),那么只需要确定列的范围即可。我们可以把每一列都求和,这样会得到单独的一行,就可以直接求这一行的最大子段和即可。


 

代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define INF 1<<27
#define MAX_SIZE 101

int res=-INF;
int n;
int map[MAX_SIZE][MAX_SIZE];

int max(int a,int b){
	return (a)>(b)?a:b;
}

void find_max(int top,int bottem){
	//1. 退化为一维数组
	int arr[MAX_SIZE];
	memset(arr,0,sizeof(arr));

	int i,j;
	for(i=0;i<n;i++){
		for(j=top;j<=bottem;j++){
			arr[i]+=map[j][i];
		}
	}

	//2. 求一位数组arr[0, ... , n-1]的和最大子数组的和

	//*下面这种初始化方法使得如果全部为负数的话,最大值输出最大负数,而非0
	int start[MAX_SIZE],all[MAX_SIZE];
	all[n-1]=start[n-1]=arr[n-1];

	for(i=n-2;i>=0;i--){
		start[i]=max(arr[i],arr[i]+start[i+1]);
		all[i]=max(start[i],all[i+1]);
	}

	if(all[0]>res) res=all[0];
}

void solve(){
	//枚举最上面一行和最下面一行
	int i,j;
	for(i=0;i<n;i++){
		for(j=i;j<n;j++){
			find_max(i,j);//DP:指定上下范围后,将矩形退化为一个数组,即求解数组的"和最大子数组"
		}
	}
}

int main(){
	scanf("%d",&n);
	int i,j;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&map[i][j]);
		}
	}
	solve();
	printf("%d",res);
	system("pause");

	return 0;
}
 

 

  • 大小: 17.8 KB
分享到:
评论

相关推荐

    POJ3083-Children of the Candy Corn

    《北大POJ3083-Children of the Candy Corn解题报告及AC代码解析》 在编程竞赛的世界里,北京大学的在线判题系统POJ(Problemset of JUDGER)是一个备受程序员喜爱的平台,它提供了丰富的算法题目供参赛者挑战。...

    poj 3342(树状dp)

    ### Poj 3342 (树状DP) #### 题目背景 这是一道典型的树状动态规划问题,来源于POJ平台编号为3342的题目。题目描述了一个公司的组织结构,并提出了一种特定场景下的最优解求法。 #### 题目解析 在题目描述中提到...

    DP的单调队列优化-Yuiffy.pdf

    - 递推公式`dp[i] = max(dp[j] + a[j+1] + a[i]); i-m &lt;= j &lt;= i-n`。 - 通过设置辅助数组`f[i] = dp[i] + a[i+1]`,问题转化为求区间最大值的问题。 - 使用单调队列来维护区间最大值,将时间复杂度从O(n^2)降低到O...

    poj题目分类...

    * 1050 To the Max * 1088 滑雪 * 1125 Stockbroker Grapevine * 1141 Brackets Sequence * 1159 Palindrome * 1160 Post Office * 1163 The Triangle * 1458 Common Subsequence * 1579 Function Run Fun * 1887 ...

    poj.grids.cn题型分类

    可以用二维数组`dp[i][j]`表示前`i`个物品装入容量为`j`的背包中的最大价值,其中状态转移方程为`dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])`,这里`w[i]`和`v[i]`分别是第`i`个物品的重量和价值。...

    poj题目类型总结(每题用到的算法)

    - **1054 (To the Max)**:本题涉及图的遍历(DFS/BFS)和最短路径算法,目的是找到图中两个点之间的最大边权值路径。 ### 5. 字符串处理 - **1159 (Palindrome)**:这道题考察的是字符串处理中的回文串判断,可以...

    POJ 1062 昂贵的聘礼 解题报告

    Code to read input and construct the graph ... // ... Apply Dijkstra's algorithm for each valid range and find the minimum cost ... return 0; } ``` #### 总结 通过对题目描述的理解,我们可以将其...

    状态压缩DP

    例如,在0/1背包问题中,状态转移方程为`dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])`,其中`w[i]`是第i个物品的重量,`v[i]`是第i个物品的价值。 #### 四、状态压缩动态规划的应用场景 **1. 棋盘问题** ...

    POJ滑雪问题

    这个问题是关于动态规划(Dynamic Programming, DP)的一个经典实例,被称作“POJ滑雪问题”。在编程竞赛网站POJ(Problemset Online Judge)上有编号为1088的题目,该题目的核心是通过递归算法寻找一个二维数组中的...

    华中科技大学_2022年春_算法实践报告

    在本次华中科技大学春季学期的算法实践中,学生完成并通过了多项算法题目,其中包括POJ1050、POJ1042、POJ1201以及POJ1328。每道题目的解题报告都详细地记录了问题描述、题目分析、算法设计、性能分析以及运行测试等...

    单调栈和单调队列.pdf

    - **动态规划优化**:在某些DP问题中,使用单调队列可以帮助减少状态转移次数,从而降低算法的时间复杂度。 - **滑动窗口问题**:如求解滑动窗口内的最大值或最小值。 **如何维护单调队列:** - **队尾入队操作**:...

    树形动态规划详细讲解

    - 如果不选择h,则可以选择或者不选择s,取最大值:`dp[h][0] = dp[h][0] + max(dp[s][0], dp[s][1])` 通过从叶子节点到根节点递归计算dp数组,最终可以得到根节点的dp[0]值即为所求的最大快乐指数总和。 **代码...

    NOIP 数据结构课件

    - 状态转移方程`dp[j] = max(dp[j], dp[j - Multi[i]] + Pairs[i])`,其中`j - Multi[i] &gt;= Low[i]`且`j [i]`。 ### 并查集 并查集是一种用于处理元素集合的动态数据结构,支持快速查询元素所属的集合以及合并两个...

    北京大学acm题库 题目分类

    相关题目有:1037 A decorative fence、1050 To the Max、1088 滑雪、1125 Stockbroker Grapevine、1141 Brackets Sequence、1159 Palindrome、1160 Post Office、1163 The Triangle、1458 Common Subsequence、1579...

    acm动态规划50题

    2. POJ 2593 Max Sequence 题目: 与2479题类似,也是寻找最大连续子序列和的问题,但数据量更大。为了避免超时,需要使用更高效的O(N)动态规划策略。在这个过程中,我们只需要一次遍历数组,同时更新两个值:当前子...

Global site tag (gtag.js) - Google Analytics