突然想到原来在学校的时候一同学做的一个题,所以就想到了如何来记录这个单调递增的序列?
这个可以从我们的求解过程来入手:
1,记录下最长序列的第一个数,这个不难,在计算哪个长度最大的时候可以记录,用x表示。
2,根据条件a[i]<a[x] && dp[x]=dp[i]+1,同时别忘记一点就是更新x的值,详见程序:
#include<iostream>
using namespace std;
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
int t,m,i,j,a[21],dp[21],x;
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
dp[i]=1;
}
for(i=m-2;i>=0;i--)
{
for(j=i+1;j<m;j++)
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+1);
}
for(i=0;i<m;i++)
if(ans<dp[i])
{
ans=dp[i];
x=i;
}
printf("最长序列的长度为:%d\n",ans);
printf("最长的序列为:%d",a[x]);
for(i=x+1;i<m;i++)
{
if(a[i]<a[x]&&dp[x]==dp[i]+1)
{
printf(" %d",a[i]);
x=i;
}
}
printf("\n");
}
return 0;
}