【转】最大子序列和(动态规划学习)

http://shakeone-algo.spaces.live.com/blog/cns!3472D0BEEE09F329!131.entry
动态规划问题(8) -- 最大和子序列续
拓展问题“最大和子序列”
在一个长度为n的数列中,求m个连续子序列,使得这m个连续子序列的和最大,且m个子序列无公共元素.
设f(i,j)表示在前i个数中,一共有j个连续子序列的最大和.
则f(i,j) = max {f(i-1,j)+arr[i], f(k,j-1)+arr[i]}, 其中第二个式子表示前k个数中,一共有j-1个子序列,并且arr[i]属于最后一个子序列,而且这最后一个子序列的是从k+1到i,其中k属于[j-1,i-1],当k=i-1,表示arr[i]自成一个序列,当k=j-1,表示前j-1个子序列都是由一个数构成的.然后在取值范围内遍历所有变量i,j,k,得到所求为f(n,m).
代码:(网页中的代码有错误,下面贴出mtthew的代码):
ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
#include < iostream >
using namespace std;

#define MAXLENGTH 100

int f[MAXLENGTH][MAXLENGTH],a[MAXLENGTH];

int main(){
int n;
cin
>> n;
int m;
cin
>> m;
int i;
for (i = 1 ;i <= n;i ++ ){
cin
>> a[i];
}
int j;
for (j = 1 ;j <= m;j ++ ){
for (i = j;i <= n;i ++ ){
f[i][j]
= f[i - 1 ][j] + a[i];
for ( int k = j - 1 ;k < i;k ++ ){
if (f[k][j - 1 ] + a[i] > f[i][j]){
f[i][j]
= f[k][j - 1 ] + a[i];
}
}
}
}

int best = - 1 ;
for (i = 1 ;i <= n;i ++ ){
if (best < f[i][m]){
best
= f[i][m];
}
}
// 测试数据7 2 2 -3 6 -5 -3 9 5
cout << best << endl;
}

 

转载于:https://www.cnblogs.com/iammatthew/archive/2010/08/19/1803934.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值