给出最喜欢的颜色的颜色顺序,在颜色条纹中找出最长的按相应顺序排列的序列,输出其长度。
这一题是求最长公共子序列。
一开始不知道怎么做,用深度优先搜索,最后两个测试点超时了。看了一下别人的讲解,改用动态规划,用了一个二维数组,一个用于当前状态,还有记录上一次的状态,根据上一次相同位置的状态和当前状态的前一个取最大值,以及是否等于当前值决定是否加一。
(用时:1:27:51.00)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int l,m;
scanf("%d%d",&n,&m);
int color[m];
for(int i=0; i<m; i++) {
scanf("%d",&color[i]);
}
scanf("%d",&l);
int k;
int strip[l+1];
for(int i=1; i<=l; i++) {
scanf("%d",&k);
strip[i] = k;
}
int lcs[2][l+1] = {0};
for(int i =0; i<2; i++)
for(int j=0; j<l+1; j++) {
lcs[i][j] = 0;
}
int index = 0;
int bindex = 0;
int num = 0;
int maxValue = 0;
for(int i=0; i<m; i++) {
index = i%2;
bindex = (index + 1) %2;
for(int j=1; j<=l; j++) {
num = 0;
if(color[i]==strip[j]) {
num = 1;
}
if(lcs[index][j-1] >=lcs[bindex][j] ) {
lcs[index][j] = lcs[index][j-1] + num;
} else {
lcs[index][j] = lcs[bindex][j] + num;
}
}
}
printf("%d\n",lcs[index][l]);
return 0;
}