您的位置:首页 > 其它

动态规划实现最大连续子序列和,最长不下降子序列和最长公共子序列

2017-10-07 14:33 387 查看
这都是比较常见的基础动态规划的问题,递归自顶向下实现这里就不说了。理论上网上都比较多,主要把简单的代码实现写下来。最大连续子序列和,最长不下降子序列和最长公共子序列都是经过测试的代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int continuous(vector<int> arr){//最长连续子序列的和
vector<int> res(arr.size());
res[0]=arr[0];
for(int i=1;i<arr.size();i++)//状态转移方程res[i]=max(res[i-1]+arr[i],arr[i]);
res[i]=max(res[i-1]+arr[i],arr[i]);
//遍历一遍res求出最大的值
int m=res[0];
for(int i=1;i<res.size();i++)
m=max(m,res[i]);
return m;
}

int LIS(vector<int> arr){//最长不递减问题
vector<int> res(arr.size(),1);
//res[i]代表以i为结尾的最长子序列
//状态转移方程:res[i]=max(res[i],res[j]+1);
for(int i=1;i<arr.size();i++){
for(int j=0;j<i;j++){
if(arr[i]>arr[j])
res[i]=max(res[i],res[j]+1);
}
}
int m=1;
for(int i=1;i<res.size();i++)
m=max(m,res[i]);
return m;
}

int LCS(string str1,string str2){//最长公共子序列长度
int m=str1.size(),n=str2.size();
vector<vector<int> > res(m+1,vector<int>(n+1,0));
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
if(str1[i-1]==str2[j-1])//字符串要从下标为0开始
res[i][j]=res[i-1][j-1]+1;
else
res[i][j]=max(res[i-1][j],res[i][j-1]);
}
}
return res[m]
;
}

int main(){
int test1[]={-2,11,-4,13,-5,-2};
vector<int> a(test1,test1+6);
cout<<"最长连续子序列的和为:"<<continuous(a)<<endl;

int test2[]={12,10,3,-1,-2,7,9};
vector<int> b(test2,test2+7);
cout<<"最长不下降子序列长度为:"<<LIS(b)<<endl;

string s2="sadstory",s1="adminsorry";
cout<<s1<<"和"<<s2<<"最长公共子序列长度为:"<<LCS(s1,s2)<<endl;
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划
相关文章推荐