4️⃣P8、9、10 给定N个整数的序列,求最大子列和【暴力法】【分治法】【⭐️动态规划】
👩⚖写在前面的总结:第一次接触分治法,理解尚可,代码难写,主要是自己现在对于递归不太熟练,理解的不够透彻;动态规划是第一次知道这个名词,但是这道题的动态规划方法理解起来并不困难,代码也挺简单的。同时也是第一次真正接触vector,真正地在代码里去使用它,竟然连简单的怎么初始化都不会,看来还要多学习。
⭕️暴力法
#include <iostream>
#include <vector>
using namespace std;
int maxsubseqsum(const vector<int> &a){
int i, j, sum, maxsum=0;
for (i=0; i<a.size(); i++){
sum = a[i];
for (j=i+1; j<a.size(); j++){
sum +=a[j];
if(sum>maxsum) maxsum=sum;
}
}
return maxsum;
}
int main(){
vector<int> a{4, -3, 5, -2, -1, 2, 6, -2};
cout << "最大子列和为:" << maxsubseqsum(a) << endl;
return 0;
}
⭕️分治法
#include <iostream>
#include <vector>
using namespace std;
int max3(int a, int b, int c){
int max2=(a> b) ? a : b;
return (max2> c) ? max2 : c;
}
int maxsumrec(const vector<int> &a, int left, int right){
if (left == right){
if(a[left]>0)
return a[left];
else return 0;
}
int center = (left + right) / 2;
int leftmaxsum = maxsumrec(a, left, center);
int rightmaxsum = maxsumrec(a, center+1, right);
int leftsum=0, maxleftsum=0;
for (int i=center; i>=left; i--){
leftsum += a[i];
if(leftsum > maxleftsum)
maxleftsum = leftsum;
}
int rightsum=0, maxrightsum=0;
for (int i=center+1; i<right; i++){
rightsum += a[i];
if(rightsum > maxrightsum)
maxrightsum = rightsum;
}
return max3(leftmaxsum, rightmaxsum, maxleftsum+maxrightsum);
}
int maxsubseqsum(const vector<int> &a){
return maxsumrec(a, 0, a.size()-1);
}
int main(){
vector<int> a{4, -3, 5, -2, -1, 2, 6, -2};
cout << "最大子列和为:" << maxsubseqsum(a) << endl;
return 0;
}
⭕️动态规划
#include <iostream>
#include <vector>
using namespace std;
int maxsubseqsum(const vector<int> &a){
int i, sum=0, maxsum=0;
for (i=0; i<a.size(); i++){
sum += a[i];
if(sum>maxsum) maxsum=sum;
else if(sum<0) sum=0;
}
return maxsum;
}
int main(){
vector<int> a{4, -3, 5, -2, -1, 2, 6, -2};
cout << "最大子列和为:" << maxsubseqsum(a) << endl;
return 0;
}