LIS,LCS,LICS模板

最长递增子序列模板(1)

  

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    int n;
    int ans = 0;
    int dp[1005];
    int num[1005];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    dp[0] = 1;
    int x = 0;
    for(int i=0;i<n;i++){
        ans = 0;
        for(int j=0;j<i;j++){
            if(num[i]>num[j]){
                ans = max(dp[j],ans);
            }
        }
        dp[i] = ans+1;
        if(dp[i]>x) x = dp[i];
    }
    printf("%d",x);
    return 0;
}

最长递增子序列模板2

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int dp[1005];
int num[1005];
int seach(int start,int end,int n){
    while(start<=end){
        int mid = (start+end)/2;
        if(dp[mid]<n){
            start++;
        }else if(dp[mid]>n){
            end--;
        }else{
            return mid;
        }
    }
    return start;
}
int main()
{
    int n;
    int ans = 0;
    int l = 1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&num[i]);
    }
    dp[l] = num[1];
    for(int i=2;i<=n;i++){
        int position = seach(1,l,num[i]);
        dp[position] = num[i];
        if(position>l)l++;
    }
    printf("%d",l);
    return 0;
}

最长公共子序列模板

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char x[1005],y[1005];
int dp[1005][1005];
int main()
{
       scanf("%s %s",x+1,y+1);
    x[0]=y[0]=‘.‘;           //开头给他们一样的值
    int len=strlen(x)>strlen(y)?strlen(x):strlen(y);//最大长度
    for(int i=0;i<=len;++i)//初始化数组为0
        dp[i][0]=dp[0][i]=0;
    for(int j,i=1;i<strlen(x);++i)
        for(j=1;j<strlen(y);++j)
            if(x[i]==y[j])
                dp[i][j]=dp[i-1][j-1]+1;
            else
                dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
    printf("%d\n",dp[strlen(x)-1][strlen(y)-1]);
    return 0;
}

最长公共上升子序列和模板

void time_LICS()  //时间优化
{
    for (int i=1;i<=n;i++)
    {
        int ma=0;
        for (int j=1;j<=n;j++)
        {
            if (a[i]==b[j])
                f[i][j]=ma+1;
            else f[i][j]=f[i-1][j];
            if (b[j]<a[i] && f[i-1][j]>ma)
                ma=f[i-1][j];
            ans=max(ans,f[i][j]);
        }
    }
    printf("%d\n",ans);
}
void space_LICS() //空间优化
{
    for (int i=1;i<=n;i++)
    {
        int ma=0,tmp;
        for (int j=1;j<=n;j++)
        {
            tmp=ma;
            if (b[j]<a[i] && f[j]>ma)
                ma=f[j];
            if (a[i]==b[j])
                f[j]=tmp+1;
            ans=max(ans,f[j]);
        }
    }
    printf("%d\n",ans);
}

原文地址:https://www.cnblogs.com/wysAC666/p/10537541.html

时间: 2024-09-30 10:30:35

LIS,LCS,LICS模板的相关文章

LIS &amp;&amp; LCS &amp;&amp; LCIS模板

1. LIS O (n^2): /* LIS(Longest Increasing Subsequence) 最长上升子序列 O (n ^ 2) 状态转移方程:dp[i] = max (dp[j]) + 1 (a[j] < a[i],1 <= j < i) 附带有print输出路径函数 */ void LIS(void) { int ret = 0, last = 0; for (int i=1; i<=n; ++i) { dp[i] = 1; fa[i] = -1; for (i

HDU 1423 LICS 模板

http://acm.hdu.edu.cn/showproblem.php?pid=1423 4.LICS.O(lena * lenb) 设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时,能匹配的最大值. ①.不匹配a[i]这个数,则是dp[i][j] = dp[i – 1][j]; ②.匹配a[i]这个数,则需要a[i] == b[j] && b[j] > b[k]   推出   dp[i][j] = max(dp[i – 1][k]) + 1, 这样复杂度需要O(n3

bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))

基因匹配Match 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成 DNA序列的每一种碱基在该序列中正好出现5次!这样如果一个DNA序列有N种不同的碱基构成,那么它的长度一定是5N. 卡卡醒来后向可可叙述了这个奇怪的梦,而可 可这些日子正在研究生物信息学中的基因匹配问题,于是他决定为这个奇怪星球上的生物写一个简单

最长上升子序列 CSU - 1047 ( LIS LCS )

名词解释: 一串数字比如1.5.3.6.9.8.10,它的子序列是从左到右不连续的若干个数,比如1.5.6,3.9.8.10都是它的子序列. 最长上升子序列即从左到右严格增长的最长的一个子序列,1.5.6.9.10就是这个序列的一个最长上升子序列. 给出若干序列,求出每个序列的最长上升子序列长度. Input 多组数据,每组第一行正整数n,1 <= n <= 1000,第二行n个空格隔开的不大于1,000,000的正整数. Output 每组数据输出一行,最长上升子序列的长度. Sample

LIS/LCS/LCIS

1.最长上升子序列 2.最长公共子序列 对于两个序列X={x1,x2,x3...xi ...},Y={y1,y2,y3... yi...} 3.最长上升公共子序列 以下摘自刘汝佳<最长公共上升子序列(LCIS)的O(n^2)算法> 预备知识:动态规划的基本思想,LCS,LIS. 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列). 首先我们可以看到,这个问题具有相当多的重叠子问题.于是我们想到用DP搞.DP的首要任务是什么?定义状态. 定义状态F[i][j]表示以a串的前i个字

DP解LCS问题模板及其优化

LCS--Longest Common Subsequence,即最长公共子序列,一般使用DP来解. 常规方法: dp[i][j]表示字符串s1前i个字符组成的字符串与s2前j个字符组成的字符串的LCS的长度,则当s1[i-1]==s2[j-1]时,dp[i][j]=dp[i-1][j-1],否则dp[i][j]=max(dp[i-1][j],dp[i][j-1]). 最终的dp[len1][len2]即最终答案.代码如下: 1 #include<cstdio> 2 #include<c

最长公共上升子序列(LICS) 模板

1 void LICS() 2 { 3 for (int i=1;i<=n;i++) 4 { 5 int ma=0; 6 for (int j=1;j<=n;j++) 7 { 8 if (a[i]==b[j]) 9 f[i][j]=ma+1; 10 else f[i][j]=f[i-1][j]; 11 if (b[j]<a[i] && f[i-1][j]>ma) 12 ma=f[i-1][j]; 13 ans=max(ans,f[i][j]); 14 } 15 }

LIS LCS 最长上升子序列 最长公共子序列 ...

最长上升子序列,问题定义:http://blog.csdn.net/chenwenshi/article/details/6027086 代码: public static void getData( char[] L ) { int len = L.length; int[] f = new int[len]; String[] res = new String[len]; for( int i = 1; i < len; i++ ) { f[i] = 1; res[i] = "&quo

LIS n^2&amp;nlogn模板

LIS nlogn模板 http://acm.hdu.edu.cn/showproblem.php?pid=1950 #include <iostream> #include <stdio.h> #include <algorithm> #include <string> #include <math.h> #include <stdlib.h> #define maxn 40000+10 using namespace std; i