CSU1120 病毒 LICS

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120

 

Description

你有一个日志文件,里面记录着各种系统事件的详细信息。自然的,事件的时间戳按照严格递增顺序排列(不会有两个事件在完全相同的时刻发生)。
遗憾的是,你的系统被病毒感染了,日志文件中混入了病毒生成的随机伪事件(但真实事件的相对顺序保持不变)。备份的日志文件也被感染了,但由于病毒采用的随机感染方法,主日志文件和备份日志文件在感染后可能会变得不一样。
给出被感染的主日志和备份日志,求真实事件序列的最长可能长度。

Input

输入第一行为数据组数T (T<=100)。每组数据包含两行,分别描述感染后的主日志和备份日志。
每个日志文件的格式相同,均为一个整数n (1<=n<=1000)(代表感染后的事件总数)和n 个不超过100,000的正整数(表示感染后各事件的时间戳)。
注意,感染后可能会出现时间戳完全相同的事件。

Output

对于每组数据,输出真实事件序列的最长可能长度。

Sample Input

1 9 1 4 2 6 3 8 5 9 1 6 2 7 6 3 5 1

Sample Output

3
 
题意:求最长公共递增子序列
这是12年湖南省赛的一道题,也就是一道模板题而已
 
 
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int a[1005],b[1005],dp[1005],n,m;int LICS(){    int i,j,MAX;    memset(dp,0,sizeof(dp));    for(i = 1; i<=n; i++)    {        MAX = 0;        for(j = 1; j<=m; j++)        {            if(a[i]>b[j] && MAX<dp[j])                MAX = dp[j];            if(a[i]==b[j])                dp[j] = MAX+1;        }    }    MAX = 0;    for(i = 1; i<=m; i++)        if(MAX<dp[i])            MAX = dp[i];    return MAX;}int main(){    int T,i;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(i = 1;i<=n;i++)        scanf("%d",&a[i]);        scanf("%d",&m);        for(i = 1;i<=m;i++)        scanf("%d",&b[i]);        printf("%d\n",LICS());    }    return 0;}

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/htrdchh/article/details/83931661