应该是一道浅层的动态规划题吧,emmmm理解了一下午加一晚上,还问了强哥,也是似懂非懂吧,就是记录路径,说实话滚动数组不太好理解(至少我是这么认为的。。。。。。)这道题目需要记录路径。这里给出我看的博客点击打开链接
#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <map>
#include <vector>
#include <ctype.h>
using namespace std;
const int maxn = 505;
int num,ans,a[maxn],b[maxn],px[maxn][maxn],py[maxn][maxn],dp[maxn][maxn];
void Printf(int x,int y)
{
if(!dp[x][y])
return;
if(px[x][y]!=-1&&py[x][y]!=-1)
{
int tx = px[x][y],ty = py[x][y];
Printf(tx,ty);
if(dp[x][y]!=dp[tx][ty])
{
num++;
if(num<ans)
printf("%d ",b[y]);
else
printf("%d",b[y]);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
cin>>m;
for(int i=1; i<=m; i++)
cin>>b[i];
memset(dp,0,sizeof(dp));
memset(px,-1,sizeof(px));
memset(py,-1,sizeof(py));
for(int i = 1; i<=n; i++)
{
int mmax = 0,tx = 0,ty = 0;
for(int j=1; j<=m; j++)
{
dp[i][j] = dp[i-1][j];
px[i][j] = i - 1;
py[i][j] = j;
if(a[i]>b[j]&&mmax<dp[i-1][j])
mmax = dp[i-1][j],tx = i - 1,ty = j;
if(a[i]==b[j])
dp[i][j] = mmax + 1,px[i][j] = tx,py[i][j] = ty;
}
}
int sign = -1;
ans = 0;
for(int j=1; j<=m; j++)
{
if(dp[n][j]>ans)
{
ans = dp[n][j];
sign = j;
}
}
num = 0;
printf("%d\n",ans);
Printf(n,sign);
cout<<endl;
if(t)
cout<<endl;
}
return 0;
}