LIS(最长不下降子序列)解法:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, m, l;
int fc[210],tc[10010],chash[210],dp[10010],s[10010];//写完发现,tc完全不用定义
int main()
{
fill(chash, chash + 210, -1);
scanf("%d", &n);
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
scanf("%d", &fc[i]);
chash[fc[i]] = i;
}
scanf("%d", &l);
int num = 0;
for (int i = 0; i < l; i++)
{
scanf("%d", &tc[i]);
if (chash[tc[i]] >= 0) s[num++] = tc[i];//要先选好喜欢的颜色
}
int ans = -1;
for (int i = 0; i < num; i++)
{
dp[i] = 1;
for (int j = 0; j < i; j++)
{
if (chash[s[i]] >= chash[s[j]] && dp[i] < dp[j] + 1)
dp[i] = dp[j] + 1;
}
ans = max(ans, dp[i]);
}
printf("%d", ans);
return 0;
}
最长公共子序列(LCS)解法:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, m, l;
int a[210], b[10010], dp[210][10010];
int main()
{
scanf("%d", &n);
scanf("%d", &m);
for (int i = 1; i <= m; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &l);
for (int i = 1; i <= l; i++)
{
scanf("%d", &b[i]);
}
for (int i = 0; i <= m; i++) dp[i][0] = 0;
for (int i = 0; i <= n; i++) dp[0][i] = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= l; j++)
{
if (a[i] == b[j]) dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + 1;
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
printf("%d", dp[m][l]);
return 0;
}