动态规划——求连续和为最大的子序列
2014-11-12 18:24
211 查看
题目
在一个数组中找出和最大的连续几个数(至少包含一个数)。例如:数组A[] = [ -2, 1, -3, 4, -1, 2, 1, -5, 4],则连续的子序列[4, -1, 2, 1]有最大的和6
输入:数组长度n;长度为n的整型数组
输出:最大的和的值
分析
该题目的每次决策依赖于当前的状态,又随即引起状态的转移。问题的最优解所包含的子问题的解也是最优的,具有最优子结构,满足最优化原理。所以可以采用动态规划的方式进行解决。
设函数Fk表示只考虑前k个数字,且第k个数字在连续序列之中时,获得的最大和的值。
因此,递推方程为当Fk > 0时, Fk+1 = Fk + k。 Fk <=0 时, Fk+1 = k。由于题目只要求最大和的值,所以在动态规划过程中,用变量sum对最大和进行记录。
代码
在一个数组中找出和最大的连续几个数(至少包含一个数)。例如:数组A[] = [ -2, 1, -3, 4, -1, 2, 1, -5, 4],则连续的子序列[4, -1, 2, 1]有最大的和6
输入:数组长度n;长度为n的整型数组
输出:最大的和的值
分析
该题目的每次决策依赖于当前的状态,又随即引起状态的转移。问题的最优解所包含的子问题的解也是最优的,具有最优子结构,满足最优化原理。所以可以采用动态规划的方式进行解决。
设函数Fk表示只考虑前k个数字,且第k个数字在连续序列之中时,获得的最大和的值。
因此,递推方程为当Fk > 0时, Fk+1 = Fk + k。 Fk <=0 时, Fk+1 = k。由于题目只要求最大和的值,所以在动态规划过程中,用变量sum对最大和进行记录。
代码
#include <iostream> using namespace std; int main() { int n; cin >> n; int i; int arr ; for(i=0;i<n;i++) cin>>arr[i]; int j; int sumPrevious=0,sum=arr[0]; for(j=0;j<n;j++) { if(sumPrevious<0) sumPrevious=arr[j]; else sumPrevious+=arr[j]; if(sum < sumPrevious) sum = sumPrevious; } cout << sum; return 0; }
相关文章推荐
- 杭电OJ 1003题 动态规划 最大连续序列和
- 最大子序列、最长连续公共子串(连续)、最长公共子序列(动态规划)
- 算法题——最大(连续)子序列乘积
- lintcode乘积最大子序列(动态规划)
- HDU1231 最大连续子序列(动态规划)
- LeetCode -- 最大连续乘积子序列
- 连续最大子序列和的几种算法
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- HDU 1087(动态规划-最大上升序列)
- HDU 1069 最大子序列和(不连续)变形
- 最大连续子序列和-动态规划
- 合唱队----动态规划(求解最大递增/减子序列)
- pku 2479 最大连续和的两序列 dp
- 和最大子序列---动态规划
- HDU 2845(动态规划-最大非连续区间)
- hud1151 动态规划 最大的公共子序列
- 数字序列加入+,*运算符后取得最大值问题; 动态规划;打破传统从决策入手思想;找出问题的特有性质;从例子入手找特点
- 动态规划 - 最大连续子序列
- Max Sum 最大连续和的子序列 HDU 1003 (一维序列DP)
- 动态规划求最大连续字序列