【LIS和LCS】最长上升子序列和最长公共子序列
2018-03-09 09:21
393 查看
STL中关于二分查找的函数有三个lower_bound 、upper_bound 、binary_search 。这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数。lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。lower_bound和upper_bound如下图所示:
LCS的例题:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int dp[1500][1500];
int main()
{
char a[1500];
char x;
int pos=1;
while(scanf("%c",&x)==1 && x!=10)
{
a[pos]=x;
pos++;
}
pos--;
char b[1500];
int pos1=1;
while(scanf("%c",&x)==1 && x!=10)
{
b[pos1]=x;
pos1++;
}
pos1--;
memset(dp,0,sizeof(dp));
for(int i=1;i<=pos;i++)
{
for(int j=1;j<=pos1;j++)
{
if(a[i]==b[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[pos][pos1];
return 0;
}注意,之前程序调试发现了几处错误:
第一个是开内存的问题,还是要把dp数组开到主函数之外当作全局变量才开的出来,不然运行要死。
第二个是string和char数组的问题,其实还是用char数组比较好,因为内存可以开大一点,string容易遇到内存开不够的情况。
第三个是细心和习惯的问题,注意最长公共子序列中,i和j都是从1开始的,如此一来,应该把char数组都从1开始存储。那么就需要记一个固定技巧写法:
char a[1500];
char x;
int pos=1;
while(scanf("%c",&x)==1 && x!=10) //10是换行的ASCII值,意思是回车了就不输入了。
{
a[pos]=x;
pos++;
}
pos--;得到的pos即是数组a的实际字符数。遍历从1~pos即可了。
相关文章推荐
- LCS(最长公共子序列)、LIS(最长上升子序列)、LCIS(最长公共上升子序列)
- 最长上升子序列问题(LIS)和最长公共子序列问题(LCS)
- LIS&LCS最长递增子序列和最长公共子序列问题
- 最长上升子序列(LIS)与最长公共子序列(LCS)
- LIS(最长递增子序列)和LCS(最长公共子序列)的总结
- 最长上升子序列(LIS)&最长公共子序列(LCS)
- 最长上升子序列(LIS) -最长公共子序列(LCS)
- Monkey and Banana(LIS最长上升子序列)
- LIS(最长上升子序列)
- DP LIS(最长上升子序列) POJ 2533 POJ 1836 POJ 2138 HDU 1069
- LIS(最长上升子序列两种算法模板)DP模板,并且输出序列
- [Treap] [LIS] BZOJ[3173] [Tjoi2013]最长上升子序列
- 最长上升子序列LIS
- 最长上升子序列(LIS)长度的O(nlogn)算法
- POJ 3903 Stock Exchange (LIS:最长上升子序列)
- lis 最长上升子序列
- DP LIS(最长上升子序列) POJ 2533 POJ 1836 POJ 2138 HDU 1069
- 南阳 1042 Tamama的排序游戏(最长上升子序列LIS)
- [动态规划]之裸lis之最长上升子序列POJ 2533
- 动态规划-最长上升子序列LIS