poj 1050 || hdu 1081 To The Max

来源:互联网 发布:gdp 知乎 编辑:程序博客网 时间:2024/05/20 08:45

可以理解为是最大子段和的加强版吧

最大子段和对应一维数组,求其最大连续子段和

而本题对应的是二维数组,求其最大连续矩形块和

轻工校赛被虐回来后,卢凯鹏学长和我们谈了谈,在这些对话中真的学到了很多

意识到照以前的模式刷题、学习只能一直做水题!自己要勤于思考!!!

ACM锻炼的不只是代码能力,更重要的是你的思维!!!

这里再看这道题,既然是最大子段和加强版,那么最大子段和是怎么求的呢?

下面是求最大子段和函数的代码:

int findSubMaxSum(int a[]){int b = 0;int sum = 0;for(int i=1; i<n; ++i){if(b > 0){b += a[i];} else {b = a[i];}if(b > sum)sum = b;}return sum;}

很容易想到这种算法是对的,那么这个算法究竟是采用的什么原理呢??

其实sum = max{ b[i] },初始时想到用b这个数组中的b[i]对应于以a[i]做结尾的最大子串

那么很明显有b[i] = max( b[i-1]+a[i], a[i] ) 

把所有的b[i]求出来后,再找到其中的最大值就是sum,这里之所以要用到b数组是因为在求出所有的b[i]值后,再重新遍历求其最大值,可以想到如果在对b数组求值的时候每次更新sum,就没有必要用到b数组了,而可以仅以一个变量b代替,因为只会在该次循环中用到一次!!!

//初始时用b数组处理,最后再简化为b

对该函数,最后的返回值是sum,而sum = max { b };

因此上面红色的状态转移方程就可以改写为:b = max( b+a[i], a[i] );

//函数中用条件b>0是否成立做操作,可以发现b>0对应的就是b+a[i] > a[i]


既然最大子段和的方法分析清楚了,现在我们再根据这个方法来解决最大子段和加强版的问题:

一维数组最大子段和的方法是:b[j]对应的从a[i]到a[j]的最大子段和( 其中1 <= i <= j )

那么类似的求二维数组的最大子段和也可以采用类似的方法做:

用b[i][j]标志从第i行到第j行的最大矩阵元素和(含第i行、第j行),则显而有n*n对应的最大矩阵元素和为:max{ b[i][j] }

,找出所有的b[i][j]再取最大值即可

b[i][j]的求法就是把从第i行到第j行都压缩到j行,再对j行求最大子串和即可!!!

既然一维数组可以用变量b取代数组b,那么二维的是否可以用一维数组b取代二维数组b呢,答案是可以的

代码如下:

#include <map>#include <cmath>#include <vector>#include <string>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define esp 1e-9#define MAXN 110#define ll long long#define INF 0x7FFFFFFF#define BUG system("pause")#define SW(a,b) a^=b;b^=a;a^=b;using namespace std;int g[MAXN][MAXN];int dp[MAXN][MAXN];int a[MAXN];int n;int findSubMaxSum(int a[]){int b = 0;int sum = 0;for(int i=1; i<n; ++i){if(b > 0){b += a[i];} else {b = a[i];}if(b > sum)sum = b;}return sum;}int main(void){while(cin >> n){for(int i=1; i<=n; ++i){for(int j=1; j<=n; ++j){cin >> g[i][j];}}int maxdp = 0;for(int i=1; i<=n; ++i){memset(a, 0, sizeof(a));for(int j=i; j<=n; ++j){for(int k=1; k<=n; ++k){a[k] += g[j][k];//cout << "a[" << j << "][" << k << "] = " << a[j][k] << endl;}//cout << "findSubMaxSum -- a[" << j << "] = " << findSubMaxSum(a[j]) << endl;maxdp = max(findSubMaxSum(a), maxdp);}}cout << maxdp << endl; } return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美图m4拍照黑屏怎么办 美图m4很卡怎么办 美图m8工厂模式怎么办 美图m6开不了机怎么办 美图m8开不开机怎么办 美图摄像头坏了怎么办 美图t8相机模糊怎么办 美图m4卡槽坏了怎么办 美图t8手机好卡怎么办 美图手机m6卡怎么办 美图t8屏幕不亮怎么办 美图m8卡机了怎么办 美图m6手机太卡怎么办 美图t8闪退怎么办 美图手机相机闪退怎么办 美图手机闪屏怎么办 魅族m6相册闪退怎么办 美图m6工厂模式怎么办 美图m6手机死机怎么办 美图m6s开不了机怎么办 美图手机m6进水怎么办 美图t8摔黑屏怎么办 美图屏幕点不动怎么办 朗动钥匙丢了怎么办 深圳小汽车摇号中签了怎么办 深圳摇号审核通过后怎么办 京东过保修期了怎么办 买的商业预付卡怎么办 壹钱包预付卡金额不足怎么办 美发店换老板原来预付卡怎么办 超市预付卡现超市停业怎么办? 利群购物卡丢了怎么办 利群金卡丢了怎么办 坐飞机洗漱用品超过规定怎么办 请律师团了解后怎么办 三星s9开不了机怎么办 三星手机开不了机了怎么办 安卓手机音响进水了怎么办 音响不读u盘怎么办 虎牌水壶显示f2怎么办 海尔冰箱门关不严没吸力怎么办