码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划求取连续数组最大和

时间:2014-08-04 14:20:27      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:c++   算法   动态规划   

int main()
{
const int size=10;
int array[size]={3,-1,8,-10,11,2,3,4,-7,3};//输入数组
int MaxSumOfArray[size]={0};//此数组保存下标对应元素值为,从array数组 【0-下标】连续子数组的最大和。

MaxSumOfArray[0]=array[0];
int currentSum=0;//这个变量应该有个更好的名字!

for(int i=1;i<size;i++){
    currentSum+=array[i];

       if(currentSum>=0)
       {
           MaxSumOfArray[i]=MaxSumOfArray[i-1]+currentSum;//增加新的子数组最大和
           currentSum=0;
       }
       else if(array[i]>MaxSumOfArray[i-1])//新的子数组最大和为当前元素的值
       {
           MaxSumOfArray[i]=array[i];
           currentSum=0;
       }
       else
           MaxSumOfArray[i]=MaxSumOfArray[i-1];//新的子数组最大和保持不变


}
for(int i=0;i<size;i++)
cout<<MaxSumOfArray[i]<<endl;

return 0;
}

网上有很多优化版本,不能容易体现出动态规划思想,为了说明问题未采取任何优化。此段代码利用动态规划算法,求连续数组最大和。

1.用另一个等长数组保存连续数组的最大和以避免重复计算。空间换时间,避免子问题重复。

2.我们通过子问题的最优解计算出上层问题最优解,例如:

MaxSumOfArray[i]=MaxSumOfArray[i-1]+currentSum;
MaxSumOfArray[i]=MaxSumOfArray[i-1];

所以我们看,这个问题包含最优子结构和重叠子问题,因此他才适合使用动态规划思想。

文中代码,只是表达思想,并没有处理非法参数等异常情况。

动态规划求取连续数组最大和,布布扣,bubuko.com

动态规划求取连续数组最大和

标签:c++   算法   动态规划   

原文地址:http://blog.csdn.net/zjq2008wd/article/details/38368089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!