突然想到原来在学校的时候一同学做的一个题,所以就想到了如何来记录这个单调递增的序列?
这个可以从我们的求解过程来入手:
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; }