最大子数组和
最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int maxSubSum(const vector<int> & arr,int &begin,int &end){
int maxSum=0;
int curSum=0;
for(int i=0;i<arr.size();++i){
curSum=max(arr[i],arr[i]+curSum);
maxSum=max(maxSum,curSum);
}
return maxSum;
}
最长递增子序列
比如arr={1,5,8,2,3,4}的最长递增子序列是1,2,3,4
动态规划的思想,考虑{arr[0],...,arr[i]}的最长递增子序列时需要找到所有比arr[i]小的arr[j],且j<i,结果应该是所有{arr[0],...,arr[j]}的最长递增子序列中最长的那一个再加1。即我们需要一个辅助的数组aid_arr,aid_arr[i]的值是{arr[0],...,arr[i]}的最长递增子序列的长度,aid_arr[0]=1。
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main(){
const int len=14;
int arr[len]={1,9,3,8,11,4,5,6,4,1,9,7,1,7};
vector< int > vec(&arr[0],&arr[len]);
vector< int > monoseqlen(len,1);
vector< int > preindex(len,-1);
int maxmonoseqlen=-1;
int maxmonoindex=-1;
for ( int i=1;i<len;++i){
int curr=vec[i];
for ( int j=0;j<i;++j){
if (vec[j]<vec[i]){
int msl=monoseqlen[j]+1;
if (msl>monoseqlen[i]){
monoseqlen[i]=msl;
preindex[i]=j;
}
}
}
}
for ( int i=0;i<len;++i){
if (monoseqlen[i]>maxmonoseqlen){
maxmonoseqlen=monoseqlen[i];
maxmonoindex=i;
}
}
|