题目是LIS 和 LCA 的结合,用f[i][j]表示a1~ai,b1~bj可以构成的以bj为结尾(这点很重要!!!)的LCIS长度。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int f[3005][3005], a[3005], b[3005];
int main()
{
int n, i, j, k;
cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i];
for (i = 1; i <= n; i++)
cin >> b[i];
int ans = -(1 << 30);
for(i=1;i<=n;i++)
for (j = 1; j <= n; j++) {
if (a[i] == b[j]) {
for (k = 0; k < j; k++)//k一定是从0开始的!!!!!!
if(b[k]<a[i])
f[i][j] = max(f[i][j], f[i - 1][k] + 1);
}
else
f[i][j] = f[i - 1][j];
ans = max(ans, f[i][j]);
}
cout << ans << endl;
return 0;
}
另一种只要二重循环的写法:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int f[3005][3005], a[3005], b[3005];
int main()
{
int n, i, j, val;
cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i];
for (i = 1; i <= n; i++)
cin >> b[i];
int ans = 1 << 31;
for (i = 1; i <= n; i++) {
val = 0;
for (j = 1; j <= n; j++) {
if (a[i] == b[j])f[i][j] = val + 1;
else f[i][j] = f[i - 1][j];
ans = max(ans, f[i][j]);
if (b[j] < a[i])val = max(val, f[i - 1][j]);
}
}
cout << ans << endl;
return 0;
}