hdu 1423(LCS+LIS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1423

好坑啊。。还有公共串为0时的特殊判断,还有格式错误。。看Discuss看知道除了最后一组测试数据之外都需要空行。。

其余的会LCS打印路径就行了。

///公共最长上升子序列
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#define N 505
using namespace std;

int dp[N][N],flag[N][N];
int dp1[N];
int a[N],b[N],c[N];
int n,m,k;

void solve_c(int i,int j){
    if(i==0||j==0) return;
    if(flag[i][j]==0){
        solve_c(i-1,j-1);
        c[++k] = a[i];
    }else if(flag[i][j]==1){
        solve_c(i-1,j);
    }else solve_c(i,j-1);
}
void LCS(){
    memset(flag,0,sizeof(flag));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i]==b[j]){
                dp[i][j] = dp[i-1][j-1]+1;
                flag[i][j]=0;
            }else{
                if(dp[i-1][j]>dp[i][j-1]) flag[i][j]=1;
                else flag[i][j]=-1;
                dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            }
        }
    }
    //printf("%d",dp[n][m]);
    k = 0;
    solve_c(n,m);
    //for(int i=1;i<=k;i++) printf("%d ",c[i]);
}
void LIS(){
    dp1[1] = 1;
    int mx = 1;
    for(int i=2;i<=k;i++){
        dp1[i]=1;
        for(int j=1;j<i;j++){
            if(c[i]>c[j]&&dp1[i]<dp1[j]+1){
                dp1[i] = dp1[j]+1;
            }
            if(mx<dp1[i]) mx=dp1[i];
        }
    }
    if(k==0) mx = 0;
    printf("%d\n",mx);
}
int main()
{
    int tcase;
    scanf("%d",&tcase);
    while(tcase--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%d",&b[i]);
        }
        memset(dp,0,sizeof(dp));
        LCS();
        LIS();
        if(tcase) printf("\n");
    }
    return 0;
}
时间: 2024-09-29 09:33:22

hdu 1423(LCS+LIS)的相关文章

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

hdu 1503 LCS输出路径【dp】

hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走.我用1表示向上走,2向左上方走,3向左走. 刚开始输入字符串时有两种方法,直接输入:或从地址后一位输入,即此时数组起始编号为1.直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS.两者在路径输出时有些差别,以前

hdu 5495 LCS 水题

LCS Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5495 Description 你有两个序列\{a_1,a_2,...,a_n\}{a?1??,a?2??,...,a?n??}和\{b_1,b_2,...,b_n\}{b?1??,b?2??,...,b?n??}. 他们都是11到nn的一个排列. 你需要找到另一个排列\{p_1,p_2,...,p_n\}{p?1?

LCS+LIS

#include<iostream> #include<string> using namespace std; string a,b; int dp[505][505]; int main() { while(cin>>a>>b) { int len1=a.length(); int len2=b.length(); //这里把数组第一横和第一列初始化为0 for(int i=0;i<len1;i++) dp[i][0]=0; for(int i=0

浅谈LCS &amp; LIS

\(LIS\)(最长上升子序列) 求长度 \(dp\) - \(O(n ^ 2)\) 动态规划的做法 令\(f[i]\)表示以第\(i\)个元素结尾的\(LIS\)长度 则有: \(f[i] = max(f[i],f[j] + 1),(a[j] < a[i],j < i)\) 通过枚举\(f[i]\)与\(f[j]\)来不断转移状态,然后不断枚举更新最大值 \(Code\): #include<cstdio> using namespace std; #define maxn 10

hdu 1080(LCS变形)

Human Gene Functions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3008    Accepted Submission(s): 1701 Problem Description It is well known that a human gene can be considered as a sequence,

hdu 3998 Sequence LIS+最大流

题意:给定一个序列,求最长上升子序长度以及有多少组,每个元素只能用一次. 思路:先求LIS,记为num,求出以每个点为末尾的最长子序列长度.窝们将每个点点拆成i和i',i --> i' 容量为1,源点连接d[ i ]=1的点,容 量为1,汇点连接d[ i ]=num的点,容量为1.对于j<i, a[ j ] < a[ i ],d[ i ] = d[ j ] + 1的情况,j' --> i 连一条容量为1的边,跑最大流即可.详见代码: /***********************

Advanced Fruits(HDU 1503 LCS变形)

Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2358    Accepted Submission(s): 1201Special Judge Problem Description The company "21st Century Fruits" has specialized in cr

hdu 1243(LCS变形)

反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4064    Accepted Submission(s): 967 Problem Description 当 今国际反恐形势很严峻,特别是美国“9.11事件”以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件.基于此,各国都十分担心恐怖势力会对 本国社会造成的不稳