最大连续字串和与最大连续子串积

来源:互联网 发布:js实现旋转 编辑:程序博客网 时间:2024/04/30 18:29

问题:

最大连续子序列之和问题描述为:数组中里有正数也有负数,连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值。分析,对数组a进行一遍扫描,sum[i] 为前i个元素中,包含第i个元素且和最大的连续子数组,MaxSum保存当前子数组中最大和,对于a[i+1]来说,sum[i+1] = sum[i]+a[i+1],此时如果sum[i+1]<0,那么sum需要重新赋0,从i+1之后开始累加,如果sum[i+1]>0,那么MaxSum = max(MaxSum, Sum[i+1])。代码如下:

#include<iostream>  #include<vector>  #include<algorithm> #include<fstream>#include<iostream>#include<set>using namespace std;double get_max_sum(vector<double>&dou){int size = dou.size();vector<double>sum(size, 0);sum[0] = dou[0];double max_sum = sum[0];for (int i = 1; i < size; i++){sum[i] = max(sum[i-1]+dou[i],dou[i]);//sum[i]表示以i为结尾的最大连续字串和,那么字串的开头可能是[0,1]之间的任何一个数if (sum[i]>max_sum)max_sum = sum[i];}return max_sum;}int main(){ifstream fin("c:\\users\\dell\\desktop\\data.txt");vector<double>dou;double num,temp;while (fin >> num){for (int i = 0; i < num; i++){fin >> temp;dou.push_back(temp);}double re = get_max_sum(dou);cout << re << endl;dou.clear();}}
2.最大连续字串积

代码:

#include<iostream>  #include<vector>  #include<algorithm> #include<fstream>#include<iostream>#include<set>using namespace std;double get_max_proc(vector<double>&dou){int size = dou.size();double maxpro,temp;vector<double>max_pro(size, 0);//保存最大乘积vector<double>min_pro(size,0);//保存最小乘积max_pro[0] = dou[0];min_pro[0] = dou[0];maxpro = max(max_pro[0],max_pro[0]);for (int i = 1; i < size; i++){max_pro[i] = max(dou[i],max(max_pro[i-1]*dou[i],min_pro[i-1]*dou[i]));min_pro[i] = min(dou[i], min(min_pro[i - 1] * dou[i], max_pro[i - 1] * dou[i]));temp = max(max_pro[i],min_pro[i]);if (temp>maxpro)maxpro = temp;}return maxpro;}int main(){ifstream fin("c:\\users\\dell\\desktop\\data.txt");vector<double>dou;double num,temp;while (fin >> num){for (int i = 0; i < num; i++){fin >> temp;dou.push_back(temp);}double re = get_max_proc(dou);cout << re << endl;dou.clear();}}
转态转移方程为:

max_pro[i] = max(dou[i],max(max_pro[i-1]*dou[i],min_pro[i-1]*dou[i]));
min_pro[i] = min(dou[i], min(min_pro[i - 1] * dou[i], max_pro[i - 1] * dou[i]));

其中max_pro[i]表示以第i个元素结尾的最大连乘积,min_pro[i]表示以第i个元素结尾的最小连乘积.


0 0
原创粉丝点击