参见《编程之美》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解题报告及AC代码解析》 在编程竞赛的世界里,北京大学的在线判题系统POJ(Problemset of JUDGER)是一个备受程序员喜爱的平台,它提供了丰富的算法题目供参赛者挑战。...
### Poj 3342 (树状DP) #### 题目背景 这是一道典型的树状动态规划问题,来源于POJ平台编号为3342的题目。题目描述了一个公司的组织结构,并提出了一种特定场景下的最优解求法。 #### 题目解析 在题目描述中提到...
- 递推公式`dp[i] = max(dp[j] + a[j+1] + a[i]); i-m <= j <= i-n`。 - 通过设置辅助数组`f[i] = dp[i] + a[i+1]`,问题转化为求区间最大值的问题。 - 使用单调队列来维护区间最大值,将时间复杂度从O(n^2)降低到O...
* 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 ...
可以用二维数组`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`个物品的重量和价值。...
- **1054 (To the Max)**:本题涉及图的遍历(DFS/BFS)和最短路径算法,目的是找到图中两个点之间的最大边权值路径。 ### 5. 字符串处理 - **1159 (Palindrome)**:这道题考察的是字符串处理中的回文串判断,可以...
Code to read input and construct the graph ... // ... Apply Dijkstra's algorithm for each valid range and find the minimum cost ... return 0; } ``` #### 总结 通过对题目描述的理解,我们可以将其...
例如,在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. 棋盘问题** ...
这个问题是关于动态规划(Dynamic Programming, DP)的一个经典实例,被称作“POJ滑雪问题”。在编程竞赛网站POJ(Problemset Online Judge)上有编号为1088的题目,该题目的核心是通过递归算法寻找一个二维数组中的...
在本次华中科技大学春季学期的算法实践中,学生完成并通过了多项算法题目,其中包括POJ1050、POJ1042、POJ1201以及POJ1328。每道题目的解题报告都详细地记录了问题描述、题目分析、算法设计、性能分析以及运行测试等...
- **动态规划优化**:在某些DP问题中,使用单调队列可以帮助减少状态转移次数,从而降低算法的时间复杂度。 - **滑动窗口问题**:如求解滑动窗口内的最大值或最小值。 **如何维护单调队列:** - **队尾入队操作**:...
- 如果不选择h,则可以选择或者不选择s,取最大值:`dp[h][0] = dp[h][0] + max(dp[s][0], dp[s][1])` 通过从叶子节点到根节点递归计算dp数组,最终可以得到根节点的dp[0]值即为所求的最大快乐指数总和。 **代码...
- 状态转移方程`dp[j] = max(dp[j], dp[j - Multi[i]] + Pairs[i])`,其中`j - Multi[i] >= Low[i]`且`j [i]`。 ### 并查集 并查集是一种用于处理元素集合的动态数据结构,支持快速查询元素所属的集合以及合并两个...
相关题目有: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...
2. POJ 2593 Max Sequence 题目: 与2479题类似,也是寻找最大连续子序列和的问题,但数据量更大。为了避免超时,需要使用更高效的O(N)动态规划策略。在这个过程中,我们只需要一次遍历数组,同时更新两个值:当前子...