给定由n个整数组成的序列(a1,a2, …,an),求该序列形如
的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
-
- int DY_Sum(int a[],int n)
- {
- int sum = 0;
- int *b = (int *) malloc(n * sizeof(int)); //动态为数组分配空间
- b[0] = a[0];
- for(int i = 1; i < n; i++) //<把值记录下来,最后选择最大的值
- {
- if(b[i-1] > 0)
- b[i] = b[i - 1] + a[i];
- else
- b[i] = a[i];
- }
- for(int j = 0; j < n; j++)
- {
- if(b[j] > sum)
- sum = b[j];
- }
- delete []b; //释放内存
- return sum;
- }
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
二、基本思想与策略
基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。