动态规划实现最大连续子序列和,最长不下降子序列和最长公共子序列
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;
}
#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;
}
相关文章推荐
- 【C】动态规划--最大连续子序列和/最长不下降子序列/最长公共子序列/最长回文子串/DAG最长路
- 最大连续子序列和,最大上升子序列和,最长上升子序列,最长公共子串,最长公共子序列,最长上升公共子序列
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- 【网络流24题】最长不下降子序列(最大流,动态规划)
- 递增子序列最大和(最长递增子序列) 动态规划
- 最大子序列、最长连续公共子串(连续)、最长公共子序列(动态规划)
- 动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离日记整理
- tyvj 1208 最长不下降子序列2 求序列b1,b2,b3,…,bm中所有长度(n)最大上升子序列的个数
- joj 2529 Chorus 动态规划 最长上升子序列和最长下降子序列
- 经典字符串算法 “最长上升子序列,最大连续子序列和,最长公共子串”
- 最大子序列最长递增子序列最长公共子串最长公共子序列
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 蓝桥杯算法训练拦截导弹【最长上升子序列 & 最长非下降子序列nlogn 和 n^2】
- 最长不下降子序列 动态规划
- 最大子数组和、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 连续子序列最大和问题精讲(java实现)
- POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 最大子序列、最长公共子串、最长公共子序列 [转]