算法学习笔记(一)求解最大子序列和的问题
问题:给定一个有n(n >= 1)个整数的序列,求出其中最大连续子序列的和
在这个问题中,我给出几种做法。
方法一:暴力
来两个循环,将所有的可能情况都考虑到,再求出最大值
1 int maxValue(int data[], int length) 2 { 3 int i,j; 4 int maxData = 0; 5 for(i = 0; i < length; i ++) 6 { 7 int temp = data[i]; 8 9 for(j = i + 1; j < length; j ++) 10 { 11 temp += data[j]; 12 if(maxData < temp) 13 { 14 15 maxData = temp; 16 } 17 } 18 } 19 20 return maxData; 21 }
方法二:动态规划
老实说,由于没有学什么算法,动态规划是什么我也不懂,但是在大佬的指点下,这题动态规划好写点。
1 int main() 2 { 3 4 int arr[6] = {-2, 11, -4, 13, -5, -2}; 5 6 int arr2[6] = {0}; 7 int maxtemp = 0; 8 int i; 9 for(i = 0; i < 6; i ++) 10 { 11 maxtemp += arr[i]; 12 if(maxtemp < 0) //如果从左到右加过来和为负数,则重置为0,意为负数舍去,事实上一个树加上负数,只会越加越小。 13 { 14 maxtemp = 0; 15 }else 16 { 17 arr2[i] = maxtemp;//将动态规划的一个小步骤结果保存起来,用于以后的求解最大值 18 } 19 } 20 21 int max1 = arr2[0]; 22 23 for(i = 0; i < 6; i ++) //求解最大值,最大值就是连续最大只序列和 24 { 25 26 if(max1 < arr2[i]){ 27 max1 = arr2[i]; 28 } 29 } 30 31 cout<<max1; 32 return 0; 33 }