题意:求最长公共上升子序列
思路:找了个模板..然后就....
#include<bits/stdc++.h>
using namespace std;
const int maxn = 505;
int n1,n2;
int ans,cnt;
int a[maxn],b[maxn];
int dp[maxn][maxn];
int pre[maxn][maxn];
int lcis[maxn];
void getlcis()
{
memset(dp,0,sizeof(dp));
memset(pre,0,sizeof(pre));
for (int i = 1;i<=n1;i++)
{
int k = 0;
for (int j = 1;j<=n2;j++)
{
if (a[i]!=b[j])
dp[i][j]=dp[i-1][j];
if (a[i]>b[j] && dp[i][j]>dp[i][k])
k=j;
if (a[i]==b[j])
{
dp[i][j]=dp[i][k]+1;
pre[i][j]=k;
}
}
}
ans = -1;
int x=n1,y=0;
for (int i = 1;i<=n2;i++)
if (dp[n1][i]>ans)
{
ans = dp[n1][i];
y=i;
}
cnt = 1;
while (dp[x][y])
{
if (a[x]!=b[y])
x--;
else
{
lcis[ans-cnt]=b[y];
cnt++;
y = pre[x][y];
}
}
}
int main()
{
scanf("%d",&n1);
for (int i = 1;i<=n1;i++)
scanf("%d",&a[i]);
scanf("%d",&n2);
for (int i = 1;i<=n2;i++)
scanf("%d",&b[i]);
getlcis();
printf("%d\n",ans);
for (int i = 0;i<ans;i++)
printf("%d ",lcis[i]);
printf("\n");
}