DP之简单的求最大字段和问题
2013-06-13 15:40
239 查看
用DP的方式处理最大字段和问题,显然是很有效率的O(n)的时间复制度
设b[j]:
第1到第j个数中,从第i个数一直加到第j个数的和的最大值。就是从a[i]+a[i+1]+…+a[j]连续相加
a: -2 11 -4 13 -5 -2
b= -2 11 7 20 15 13
如果b<0的话,显然,就不用算之前的数据了,如果全部为0,就定义最长字段的和为0。
(代码中没处理,需要的话开始判定一下就行)
然后,最大字段和的其实就是b中最大的数据
求这个序列的话,最大值对应位置之前的第一个不小于0的位置一直到最大值之间的序列就是最大子段和对应的子序列。
C++语言:
#include
using
namespace
std;
int
MaxNum(int
a[],int n);
int
main()
{
int
a[6] = {-2,11,-4,13,-5,-2};
cout<<"最大字段和是:"<<MaxNum(a,6)<<endl;
}
int
MaxNum(int
a[],int n)
{
int
i,b,sum;
b=0;sum=0;
for(i = 0 ;
i
<</span> n ;
i ++)
{
if(b>0)
b += a[i];
else b
= a[i];
if(b
> sum)sum=b;
}
return
sum;
}
设b[j]:
第1到第j个数中,从第i个数一直加到第j个数的和的最大值。就是从a[i]+a[i+1]+…+a[j]连续相加
a: -2 11 -4 13 -5 -2
b= -2 11 7 20 15 13
如果b<0的话,显然,就不用算之前的数据了,如果全部为0,就定义最长字段的和为0。
(代码中没处理,需要的话开始判定一下就行)
然后,最大字段和的其实就是b中最大的数据
求这个序列的话,最大值对应位置之前的第一个不小于0的位置一直到最大值之间的序列就是最大子段和对应的子序列。
C++语言:
#include
using
namespace
std;
int
MaxNum(int
a[],int n);
int
main()
{
int
a[6] = {-2,11,-4,13,-5,-2};
cout<<"最大字段和是:"<<MaxNum(a,6)<<endl;
}
int
MaxNum(int
a[],int n)
{
int
i,b,sum;
b=0;sum=0;
for(i = 0 ;
i
<</span> n ;
i ++)
{
if(b>0)
b += a[i];
else b
= a[i];
if(b
> sum)sum=b;
}
return
sum;
}
相关文章推荐
- hdu 1024Max Sum Plus Plus 最大M段字段和 单调优化DP 从一类单调性问题看算法的优化
- 矩阵图求最优最大值问题(简单dp)
- 51NOD 最大子字段和问题(DP入门)
- dp 最大字段和 问题
- usaco2008渡河问题(简单dp)
- 51nod_1049 最大子段和(简单DP)
- 最大子矩阵问题;枚举行的组合,然后利用一维最大子段和的DP算法;
- !HDU 4293 排队分组说谎问题-dp-(不相交区间的最大个数)
- 最大字段和问题 用动态规划法求解
- HDU-1003-Max Sum(dp经典问题-最大连续子序列和)
- hdu-1078 FatMouse and Cheese (and) 滑雪问题(记忆化搜索+简单dp)
- OpenJudge_P7215 简单的整数划分问题(DP)
- [swust 1741] 最长递增子序列问题(DP,最大流)
- dp之二维的最大字段和算法
- 最简单的dp问题(1)——hdu2602
- hdu 1024 经典DP 最大m字段和
- dp解决最大子矩阵问题
- hdu 1559(简单的dp)最大子矩阵
- 简单DP之最少硬币问题(多重背包问…
- 【dp】最大长方体问题