题目:返回一个整数数组中最大子数组的和。
要求:
一开始看到题目我的第一感觉就是,挨个求出每个子数组的和,然后进行比较,这样的话有n个元素的数组就有n(n+1)/2个子数组,而且计算起来相当麻烦。然而这样时间复杂度是O(n^2)也不满足要求,正在我绞尽脑子想要解决这个问题时,我的同桌不到五分钟就把问题解决了,而且用了很少的代码。。。只想说他太厉害了,自己的差距太大。
听过他的解释,说要用到动态规划来解决此问题,会变得非常简单。于是照着他的思路,我编写了这个程序:
//求数组中最大子序列的和 王世强 2016/3/22 #include<iostream> using namespace std; int main() { int Array[100],i=1,dp[100][2],j,S; cout<<"请输入一组数组:"; cin>>Array[0]; while(getchar()!=‘\n‘) { cin>>Array[i++]; } dp[0][0]=0; dp[0][1]=Array[0]; for(j=1;j<i;j++) { dp[j][0]=max(dp[j-1][0],dp[j-1][1]); dp[j][1]=max(Array[j],(dp[j-1][1]+Array[j])); } S=max(dp[i-1][0],dp[i-1][1]); cout<<"最大子序列的和为:"<<S; return 0; }
这里解释一下,dp[i][0]和dp[i][1]。
dap[i][0]指前i个元素中,不包含Array[i]的子数组中和最大的值;dp[i][1]指前i个元素中,包含Array[i]的子数组中和最大的值。从第一个元素开始循环直至求出最后一对dp[i][0]和dp[i][1],再比较其大小,输出最大的子数组之和。
运行结果截图如下:
总结:感觉算法懂的太少,第一次听说在程序上用动态规划来解决问题,而且解决问题的效率真的很高,无论是从代码量还是时间复杂度上,都可以看出好的算法在解决问题上带来的方便。要多多努力才是!
原文:http://www.cnblogs.com/wsqJohn/p/5308586.html