动态规划——最长单调子序列
给定一个序列,求这个序列的最长上升子序列的长度,并输出这个最长上升子序列,题目保证,最长上升子序列只有一个。
我这里的思路是再设一个数组b,如果a[k]>a[i],则b[k]=b[i]+1.然后最后找到b中最大值的位置,然后再慢慢倒推回去找,得到数组
#include<stdio.h> int max(int *b,int n){ int max=b[0]; int j=0; for(int i=n-1;i>=0;i--){ if(b[i]>max){ max=b[i]; j=i; } } return j; } void maxlength(int *a,int n){ int b[n]; for(int i=0;i<n;i++){ b[i]=1; } for(int i=1;i<n;i++){ int max=0; for(int j=0;j<=i;j++){ if(a[i]>a[j]){ b[i]=b[j]+1; } if(b[i]>max){ max=b[i]; } } b[i]=max; } int d=max(b,n); int e=b[d]; printf("%d\n",e); int f[e]; int o=e; e--; f[e]=a[d]; while(e){ for(int i=0;i<d;i++){ if(b[i]==e&&f[e]>a[i]){ e--; f[e]=a[i]; } } } for(int i=0;i<o;i++){ printf("%d ",f[i]); } } int main(){ int n; scanf("%d",&n); int a[n]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } maxlength(a,n); }

浙公网安备 33010602011771号