动态规划求解最大子段和
2013-12-04 11:00
267 查看
子段:连续
如果定义中间变量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;
}
如果定义中间变量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;
}
相关文章推荐
- 动态规划求解最大子段问题的最优解
- POJ 2593 动态规划 最大子段和
- 【动态规划】HDU1422重温世界杯【最大子段和变形】
- 动态规划——最大子段和问题
- 动态规划小结(1)最大子段和
- 动态规划——A 最大子段和
- 动态规划之最大子段和问题
- [POJ1050] To the Max 及最大子段和与最大矩阵和的求解方法
- 【51nod 教程】最大子段和问题(动态规划)
- 动态规划——最大子段和
- C语言最大子段和问题(动态规划)
- 0013算法笔记——【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
- Vijos P1850 小朋友的数字(动态规划,最大子段和)
- 51Nod 1049 最大子段和(DP动态规划)
- 最大子段和 O(n)求解
- 最大子段和——分治与动态规划
- 17089 最大m子段和(scauoj、dp动态规划)
- [算法] 求解和值最大子段及绝对值最小子段
- poj 1050 To the Max(动态规划处理二维最大子段和)
- 0013算法笔记——【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题