您的位置:首页 > 其它

【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即可了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: