动态规划法-------最大连续子序列和
2015-05-29 11:06
316 查看
记得有次去索尼还有一个啥公司忘了名字,都问到了这个问题,找了下答案,特此记录一下:
问题描述 :
数组 INT A[] = {-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ; 某几个连续的子序列其和最大,比如A0+A1 = -1 。A1+A2+A3+A4 = 78 。则A1 A2 A3A4组成的数组即是所求。
解决方法:
此题尝试使用动态规划的方法进行解决,首先建立状态方程。
设B[J]表示第J处,以A[J] 结尾的子序列的最大和。
则B[J] = MAX(A[J] + B[J-1] , A[J]) ,而我们的所求的答案,就是从1- N对B数组求最大值。
代码如下:
/*
最大连续字段和 时间复杂度为O(N)
定义b[j]为数组中包含a[j]的最大连续子序列和
注意一个误区,b[j] 并不是1-j中最大的连续子序列的和,只是包含a[j]的最大子序列的和
而我们所要求的是求出b[j]中最大的值,即为所求
状态方程为: b[j] = max(b[j-1] + a[j] , a[j])
*/
#include <iostream>
using namespace std ;
const int N = 8 ;
int a[] = {-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ;
int b
; //b[i]表示包含a[i]的最大连续子序列之和
inline int max(int a , int b)
{
return (a > b) ? a : b ;
}
int main()
{
b[0] = a[0] ;
int i , mam = b[0];
for(i = 1; i < N ; i++)
{
b[i] = max(a[i] , b[i-1] + a[i]);
if(mam < b[i])
mam = b[i] ;
}
printf("max %d\n" , mam) ;
for(i = 0; i < N ; i++)
printf("%d\n" , b[i]) ;
system("pause") ;
return 0 ;
}
相关文章推荐
- OutOfMemoryError: unable to create new native thread
- 下载什么图标自己选
- Hadoop Wordcount 程序 详解
- java文件读写操作大全
- 124页第44题第三章
- Android导入AS工程
- salt-run源码分析
- iOS 在添加了UITapGestureRecognizer的UIView上响应按钮的点击事件
- Android Studio v1.0安装教程(Windows)
- maven org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
- 熟悉GRE作文考试的流程步骤
- 如何做好网络营销
- 手机维护小常识
- 自己总结的一些三大框架面试题
- linux 查找
- ACM-奋斗的小蜗牛
- p124第三章43题作业
- [LeetCode] Combination Sum III 组合之和之三
- java常用简单正则表达式写法
- lamp setup (centos)