最大子序列分治实现以及改进
来源:互联网 发布:淘宝html源代码 编辑:程序博客网 时间:2024/06/10 02:22
最大子序列,一开始我是用比较方便的向量的:
这样把上面的分治方法再写一次:
理论上是没有错的
#include <string>#include <iostream>#include <vector>#include<climits>using namespace std;
vector<int> f_m_c_s(vector<int> &a,int low,int mid,int high){int left_sum=INT_MIN;int sum=0;int max_left;for(int i=mid-1;i!=low-1;--i){sum=sum+a[i];if(sum>left_sum){left_sum=sum;max_left=i;}}int right_sum=INT_MIN;sum=0;int max_right;for(int j=mid;j!=high;++j){sum=sum+a[j];if(sum>right_sum){right_sum=sum;max_right=j;}}return vector<int>{max_left,max_right,left_sum+right_sum};}vector<int> f_m_s(vector<int> a,int low,int high){if(high==low+1){return vector<int>{low,high,a[low]};}else{int mid=(low+high)/2; vector<int>a1 = f_m_s(a,low,mid); int left_low=a1[0],left_high=a1[1],left_sum=a1[2]; //cout<<"low="; //for(auto i:a1){cout<<i<<" ";} //cout<<'\n'<<endl; vector<int>a2=f_m_s(a,mid,high); int right_low=a2[0],right_high=a2[1],right_sum=a2[2]; //cout<<"high="; //for(auto i:a2){cout<<i<<" ";} //cout<<'\n'<<endl; vector<int>a3=f_m_c_s(a,low,mid,high); int cross_low=a3[0],cross_high=a3[1]; int cross_sum=a3[2]; //cout<<"cross="; //for(auto i:a3){cout<<i<<" ";} //cout<<'\n'<<endl; if(left_sum>=right_sum && left_sum>=cross_sum){ return a1;} else if(right_sum>=left_sum && right_sum>=cross_sum){ return a2;} else {return a3;}}}
但是格式十分麻烦,看了网上的答案之后,发现可以定义一个类,专门用来储存三个数字。
实现:
typedef struct{unsigned left; unsigned right; unsigned sum;} ma;
这样把上面的分治方法再写一次:
ma f_m_c_s_ma(int a[], unsigned low, unsigned mid, unsigned high){ma result;int left_sum=INT_MIN;int sum=0;for(int i=mid-1;i!=low-1;--i){sum=sum+a[i];if(sum>left_sum){left_sum=sum;result.left=i;}}int right_sum=INT_MIN;sum=0;for(int j=mid;j!=high;++j){sum=sum+a[j];if(sum>right_sum){right_sum=sum;result.right=j;}}result.sum=left_sum+right_sum;return result;}ma f_m_s_ma(int a[],unsigned low,unsigned high){if(high==low+1){ma result={low,high,a[low]};return result;}else{int mid=(low+high)/2;ma left=f_m_s_ma(a,low,mid);ma right=f_m_s_ma(a,mid,high);ma cross=f_m_c_s_ma(a,low,mid,high);if(left.sum>=right.sum && left.sum>=cross.sum){return left;}else if(right.sum>=left.sum && right.sum>=cross.sum){return right;}else {return cross;}}}
理论上是没有错的
阅读全文
0 0
- 最大子序列分治实现以及改进
- 最大子序列 分治法
- 算法导论-分治、最大子序列问题
- 最大子序列和问题 分治算法
- 分治法求最大子序列
- 算法导论-分治、最大子序列问题
- 算法导论-分治、最大子序列问题
- BJFU1274 最大子序列和(分治)
- 最大子序列和分治算法
- 最大子序列和的分治算法
- 归并分治找最大连续子序列
- 分治法求最大子序列和
- 分治问题,求最大子序列HDU1231
- 最大上升子序列算法及其改进
- [leetcode]分治法求解最大子序列问题——Java实现
- 求序列中最大子序列和(分治算法)
- java动态规划 实现输出最大公共子序列的长度以及输出最大子字符串
- Java分治法实现最大子数组
- IOS逆向--ARM/THUMB解读
- Windows下Git的安装和基本使用方法
- 从面试实习来产品经理与技术岗的一些区别和注意事项
- delphi窗体继承
- iOS资源库AssetsLibrary
- 最大子序列分治实现以及改进
- 时间戳转换
- maven打本地可执行jar包
- 删除nginx
- 最小生成树-Prim算法实现
- 解决android悬浮按钮在魅族机上的适配问题
- bzoj 2815: [ZJOI2012]灾难 支配树
- java并发编程之一
- 弹窗组件的开发练习