题目如下:

Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts together to form her favorite color stripe.

It is said that a normal human eye can distinguish about less than 200 different colors, so Eva's favorite colors are limited. However the original stripe could be very long, and Eva would like to have the remaining favorite stripe with the maximum length.
So she needs your help to find her the best result.

Note that the solution might not be unique, but you only have to tell her the maximum length. For example, given a stripe of colors {2 2 4 1 5 5 6 3 1 1 5 6}. If Eva's favorite colors are given in her favorite order as {2 3 1 5 6}, then she has 4 possible best
solutions {2 2 1 1 1 5 6}, {2 2 1 5 5 5 6}, {2 2 1 5 5 6 6}, and {2 2 3 1 1 5 6}.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=200) which is the total number of colors involved (and hence the colors are numbered from 1 to N). Then the next line starts with a positive integer M (<=200)
followed by M Eva's favorite color numbers given in her favorite order. Finally the third line starts with a positive integer L (<=10000) which is the length of the given stripe, followed by L colors on the stripe. All the numbers in a line are separated by
a space.

Output Specification:

For each test case, simply print in a line the maximum length of Eva's favorite stripe.

Sample Input:

6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

Sample Output:

7

这道题目,按照正常的思路求解,应该使用最长公共子序列算法LCS,但与常规的LCS有所差别,常规LCS是从两个序列中按索引递增顺序,不重复的选取最大公共子列,而现在的问题是在序列B中按照A中的元素顺序可重复的找出最大子列,这样说起来比较抽象,下面举个例子,对于序列:

A={2,3,1,5,6} B={2,2,4,1,5,5,6,3,1,1,5,6}

如果是常规的LCS,我们找到的子列将会是{2,3,1,5,6},因为B完全的包含了A(不必连续)

如果是可重复的LCS,我们完全可以选择{2,2,3,1,1,5,6},这便是变种的LCS。

对于常规的LCS(关于LCS的算法请参考算法导论390页15.4节),只有A[i] = B[j]时才让当前的最大子列长度为maxLen[i-1][j-1]+1,其他情况则取maxLen[i-1][j]或者maxLen[i][j-1]中的最大值,这样的算法只能不重复的找出子列,如果要考虑重复,应该修改算法,无论什么情况,都取maxLen[i-1][j-1]、maxLen[i-1][j]和maxLen[i][j-1]中的最大值,如果A[i]=B[j],则在最大值的基础上+1,这样就可以处理重复的情况了。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector> using namespace std; int maxLen[201][10001] = {0}; int main()
{
int N,M,L;
cin >> N;
cin >> M;
vector<int> like(M+1);
int num;
for(int i = 1; i <= M; i++){
scanf("%d",&num);
like[i] = num;
}
cin >> L;
vector<int> seq(L+1);
for(int i = 1; i <= L; i++){
scanf("%d",&num);
seq[i] = num;
}
int max = 0;
for(int m = 1; m <= M; m++){
for(int n = 1; n <= L; n++){
max = maxLen[m-1][n-1];
if(max < maxLen[m-1][n]) max = maxLen[m-1][n];
if(max < maxLen[m][n-1]) max = maxLen[m][n-1];
if(like[m] == seq[n]){
maxLen[m][n] = max + 1;
}else{
maxLen[m][n] = max;
}
// if(like[m] == seq[n]){
// maxLen[m][n] = maxLen[m-1][n-1] + 1;
// }else if(maxLen[m-1][n] >= maxLen[m][n-1]){
// maxLen[m][n] = maxLen[m-1][n];
// }else{
// maxLen[m][n] = maxLen[m][n-1];
// }
}
} cout << maxLen[M][L] << endl; return 0;
}

1045. Favorite Color Stripe (30) -LCS允许元素重复的更多相关文章

  1. 1045. Favorite Color Stripe (30) -LCS同意元素反复

    题目例如以下: Eva is trying to make her own color stripe out of a given one. She would like to keep only h ...

  2. PAT 甲级 1045 Favorite Color Stripe (30 分)(思维dp,最长有序子序列)

    1045 Favorite Color Stripe (30 分)   Eva is trying to make her own color stripe out of a given one. S ...

  3. 1045 Favorite Color Stripe (30)(30 分)

    Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor ...

  4. 1045 Favorite Color Stripe (30)

    Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor ...

  5. 1045 Favorite Color Stripe (30分)(简单dp)

    Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor ...

  6. 【PAT甲级】1045 Favorite Color Stripe (30 分)(DP)

    题意: 输入一个正整数N(<=200),代表颜色总数,接下来输入一个正整数M(<=200),代表喜爱的颜色数量,接着输入M个正整数表示喜爱颜色的编号(同一颜色不会出现两次),接下来输入一个 ...

  7. PAT (Advanced Level) 1045. Favorite Color Stripe (30)

    最长公共子序列变形. #include<iostream> #include<cstring> #include<cmath> #include<algori ...

  8. 1045 Favorite Color Stripe 动态规划

    1045 Favorite Color Stripe 1045. Favorite Color Stripe (30)Eva is trying to make her own color strip ...

  9. PAT 1045 Favorite Color Stripe[dp][难]

    1045 Favorite Color Stripe (30)(30 分) Eva is trying to make her own color stripe out of a given one. ...

随机推荐

  1. python中如何将生成等差数列和等比数列

    在python库numpy 中提供了函数linspace和logspace函数用于生产等差数列和等比数列.     1.linspace函数生成等差数列 def linspace(start, sto ...

  2. Linux编程之内存池的设计与实现(C++98)

    假设服务器的硬件资源"充裕",那么提高服务器性能的一个很直接的方法就是空间换时间,即"浪费"服务器的硬件资源,以换取其运行效率.提升服务器性能的一个重要方法就是 ...

  3. Tensorflow从入门到精通之——Tensorflow基本操作

    前边的章节介绍了什么是Tensorflow,本节将带大家真正走进Tensorflow的世界,学习Tensorflow一些基本的操作及使用方法.同时也欢迎大家关注我们的网站和系列教程:http://ww ...

  4. TCP 通信

    一.TCP与UDP的区别 二.ServerSocket与Socket 1 ServerSocket 以上介绍的几个构造方法中,第二个构造方法最常用. 2.Socket import java.io.* ...

  5. python四则运算

    源代码已上传至Github,https://github.com/chaigee/arithmetic,中的python_ari.py文件 题目: (1)能自动生成小学四则运算题目,并且不能出现负数: ...

  6. Servlet生命周期与工作原理(转载)

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  7. Java transient关键字使用小结

      1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的.2.被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被t ...

  8. 一口一口吃掉Hibernate(七)——继承映射

    前几篇博文中讲到了常用的几种关联映射.其实hibernate中还有一种"省劲儿"的映射,那就是--"继承映射". 学了这么多的关系映射了,继承映射,从字面上也能 ...

  9. 借助Bodymovin播放svg动画

    svg动画,截取工具有点不忍直视了~~~ 为了实现上面的svg动画,可以使用bodymovin插件,简单配置之后,就可以直接可以实现在 AE(可视化操作,不用码代码)上面导出 svg的json数据,在 ...

  10. Python处理正则表达式超时的办法

    最近在项目中遇到一个问题,就是需要采用正则匹配一些疑似暗链和挂马的HTML代码,而公司的老大给的正则表达式有的地方写的不够严谨,导致在匹配的时候发生卡死的现象,而后面的逻辑自然无法执行了.虽然用正则表 ...