动态规划求解最大子段和

原创 2013年12月04日 11:00:36

子段:连续

如果定义中间变量b[j]=max<1...j>{  sum<k=i...j>a[k]  }即固定末尾位置j,往前数i个最大的子段和

则全序列最大子段和即遍历所有的b[j],即max<j>{ b[j] }=max<j>{  max<1...j>{  sum<k=i...j>a[k]  }  }

如果b[j-1]>0,则b[j]=b[j-1]+a[j];这是因为b[j]是从最后一个元素a[j]往前数,即必然包含a[j],而a[j]前面的元素又>0,那肯定要把前面的那段加进来才会变大。

如果b[j-1]<0, 则b【j】若把前面的加进来岂不是更小了,因此肯定不能加,这种情况下b[j]=a[j];

动态规划:  问题规模定义为opm_fromj,即 b[j]依赖于更小的问题规模b[j-1];

注意opm_fromj可以小于opm_fromj-1,这是因为opm_fromj固定的是j,从j往前数若干个元素的最大值,因此opm_fromj必然要包含数组的第j个元素。

每次迭代opm_fromj={opm_from(j-1)+pIntArray[j]当opm_fromj>0即从第j-1个元素往前数的最优子段和大于0的情况,  pIntArray[j]当opm_from[j-1]<0的情况,这时自然应该摒弃前面的内容}

从各个best_j中找出最优的那个j,存在best_j
int GetSubArraySum(int* pIntArray, int nCount)
{
    /*在这里实现功能*/
 if(pIntArray==NULL||nCount<1) return 0;
 int opm_fromj=0;//opm_fromj存储从1到j的最优值,固定j,问题规模是j
 int best_j=0;//这个是关键,存储的是最优的那个j

 for(int j=0;j<nCount;j++)//动态规划,问题规模的增加
 {
  if(opm_fromj>0) opm_fromj+= pIntArray[j];//注意是最优值大于0
        else opm_fromj=pIntArray[j];
  if(best_j<opm_fromj) best_j=opm_fromj;  // 筛选最优的b【j】

 }
    return best_j;
}

顺序表应用8:最大子段和之动态规划法

顺序表应用8:最大子段和之动态规划法 Time Limit: 5MS Memory Limit: 500KB Submit Statistic Problem Description  给定n...
  • qq_33362864
  • qq_33362864
  • 2016年09月21日 21:34
  • 669

顺序表应用8:最大子段和之动态规划法

顺序表应用8:最大子段和之动态规划法 Time Limit: 5MS Memory Limit: 500KB Submit Statistic Problem Description...
  • just_so_so_fnc
  • just_so_so_fnc
  • 2016年09月15日 11:35
  • 376

顺序表应用7:最大子段和之分治递归法

Problem Description  给定n(1当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1   注意:本...
  • xiaoxinxinev5
  • xiaoxinxinev5
  • 2017年01月15日 19:12
  • 103

最大子段和的动态规法

/*最大子段和问题:对于一个序列: -6,9,8,-10,100,-99其中:最大子段和为:100 子段长度为:10*/#include stdio.h>#include stdlib.h>#defi...
  • oopos
  • oopos
  • 2007年10月19日 15:58
  • 1687

|洛谷|动态规划|P1115 最大子段和

http://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P1115 动态规划思想,这里可以免去数组。 #include #include #i...
  • Darost
  • Darost
  • 2016年09月18日 21:48
  • 129

顺序表应用8:最大子段和之动态规划法

顺序表应用8:最大子段和之动态规划法 Time Limit: 5MS Memory Limit: 500KB Submit Statistic Problem Description...
  • AcSuccess
  • AcSuccess
  • 2016年09月25日 20:35
  • 159

顺序表应用8:最大子段和之动态规划法

Problem Description  给定n(1负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1   注意:本题目要求用动态规划法...
  • jinzk123
  • jinzk123
  • 2016年09月19日 20:16
  • 437

顺序表应用8:最大子段和之动态规划法

顺序表应用8:最大子段和之动态规划法 Time Limit: 5MS Memory Limit: 500KB Submit Statistic Problem Descriptio...
  • li1351026473
  • li1351026473
  • 2017年09月26日 21:40
  • 67

顺序表应用8:最大子段和之动态规划法

顺序表应用8:最大子段和之动态规划法 Time Limit: 5MS Memory Limit: 500KB Submit Statistic Problem Description...
  • zhao19961027
  • zhao19961027
  • 2016年09月29日 16:42
  • 117

顺序表应用8:最大子段和之动态规划法

Problem Description  给定n(1负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1   注意:本题目要求用动态规划法...
  • xiao109715
  • xiao109715
  • 2017年12月13日 21:45
  • 63
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划求解最大子段和
举报原因:
原因补充:

(最多只允许输入30个字)