最大子序列、最长递增子序列、最长公共子串、最长公共子序列

#include
#include
#include
#include
#include


#define LEFTUP 0
#define LEFT 1
#define UP 2

using namespace std;

//最大子串
int maxSubSum(const vector & arr,int &begin,int &end) {
	int maxSum = numeric_limits::min();
	int curSum = 0;
	int newbegin = 0;
	for(int i = 0; i maxSum) {
			maxSum = curSum;
			begin = newbegin;
			end = i;
		}
		if(curSum < 0) {
			curSum = 0;
			newbegin = i+1;
		}
	}
	return maxSum;
}

void test_maxSubSum() {
	int len;
	cout<<"输入数组长度:"<>len;
	cout<<"输入数组内容:"<  arr;
	int a;
	for(int i = 0; i>a;
		arr.push_back(a);
	}
	int begin,end;
	cout< vec(&arr[0],&arr[len]);

	vector monoseqlen(len,1);     //以每个元素结尾的最长递增子序列的长度
	vector preindex(len,-1);     //以每个元素结尾的最长递增子序列的上一个节点位置
	int maxmonoseqlen=-1;
	int maxmonoindex=-1;

	for(int i=1; imonoseqlen[i]) {
					monoseqlen[i]=msl;
					preindex[i]=j;
				}
			}
		}
	}

	for(int i=0; imaxmonoseqlen) {
			maxmonoseqlen=monoseqlen[i];
			maxmonoindex=i;
		}
	}

	stack st;   //保存最终子序列结果
	while(maxmonoindex>=0) {
		st.push(vec[maxmonoindex]);
		maxmonoindex=preindex[maxmonoindex];
	}

	vector rect;
	while(!st.empty()) {
		rect.push_back(st.top());
		st.pop();
	}

	vector::iterator itr=rect.begin();
	while(itr!=rect.end()) {
		cout<<*itr++<<"\t";
	}
	cout< tmp(xlen);                   //保存矩阵的上一行
	vector arr(tmp);                    //当前行
	int ylen=str2.size();                    //纵向长度
	int maxele=0;                            //矩阵元素中的最大值
	int pos=0;                               //矩阵元素最大值出现在第几列
	for(int i=0; imaxele) {
					maxele=arr[j];
					pos=j;
				}
			}
		}

		tmp.assign(arr.begin(),arr.end());
		//   vector的拷贝:https://www.cnblogs.com/xiaopanlyu/p/5644666.html
		//??		tmp = arr;
		//	template        string& assign (InputIterator first, InputIterator last);
	}
	string res = str1.substr(pos-maxele+1,maxele);
	return res;
}

void test_LCS() {
	string str1("21232523311324");
	string str2("312123223445");
	string lcs=LCS(str1,str2);
	cout<*max) {
		*max=b;
		res=1;
	}
	if(c>*max) {
		*max=c;
		res=2;
	}
	return res;
}
string LCS_2(const string& str1,const string& str2) {
	int xlen=str1.size();               //横向长度
	int ylen=str2.size();               //纵向长度
	if(xlen==0||ylen==0)                //str1和str2中只要有一个为空,则返回空
		return "";
	pair arr[ylen+1][xlen+1];    //构造pair二维数组,first记录数据,second记录来源
	for(int i=0; i<=xlen; i++)       //首行清0
		arr[0][i].first=0;
	for(int j=0; j<=ylen; j++)       //首列清0
		arr[j][0].first=0;
	for(int i=1; i<=ylen; i++) {
		char s=str2.at(i-1);
		for(int j=1; j<=xlen; j++) {
			int leftup=arr[i-1][j-1].first;
			int left=arr[i][j-1].first;
			int up=arr[i-1][j].first;
			if(str1.at(j-1)==s)         //C1==C2
				leftup++;
			int max;
			arr[i][j].second=Max(leftup,left,up,&arr[i][j].first);
		}
	}       /*矩阵构造完毕*/
	
	//回溯找出最长公共子序列
	stack st;
	int i=ylen,j=xlen;
	while(i>=0&&j>=0) {
		if(arr[i][j].second==LEFTUP) {
			if(arr[i][j].first==arr[i-1][j-1].first+1)
				st.push(i);
			--i;
			--j;
		} else if(arr[i][j].second==LEFT) {
			--j;
		} else if(arr[i][j].second==UP) {
			--i;
		}
	}
	string res="";
	while(!st.empty()) {
		int index=st.top()-1;
		res.append(str2.substr(index,1));
		st.pop();
	}
	return res;
}
void test_LCS_2() {
	string str1="GCCCTAGCG";
	string str2="GCGCAATG";
	string lcs=LCS(str1,str2);
	cout<

参考:https://www.cnblogs.com/zhangchaoyang/articles/2012070.html

你可能感兴趣的:(最大子序列、最长递增子序列、最长公共子串、最长公共子序列)