首页 > 代码库 > 动态规划求取连续数组最大和
动态规划求取连续数组最大和
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];
所以我们看,这个问题包含最优子结构和重叠子问题,因此他才适合使用动态规划思想。
文中代码,只是表达思想,并没有处理非法参数等异常情况。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。