题目大意:给定一个整数序列,求最长上升子序列的长度,并求最长上升子序列的个数。关键在于求个数,可以另设数组c[k]保存以a[k]结尾的最长子序列的个数。
View Code
1 #include <stdio.h> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define N 1000 4 int h[N],f[N],c[N],n; 5 int main() 6 { 7 int i,j,ans,cnt; 8 while(~scanf("%d",&n)) 9 { 10 for(i=0;i<n;i++) scanf("%d",&h[i]); 11 f[0]=c[0]=1; 12 for(i=1;i<n;i++) 13 { 14 f[i]=c[i]=1; 15 for(j=0;j<i;j++) 16 { 17 if(h[j]>=h[i]) continue; 18 if(f[i]==f[j]+1) c[i]+=c[j]; 19 if(f[i]<f[j]+1) f[i]=f[j]+1,c[i]=c[j]; 20 } 21 } 22 for(i=0,ans=cnt=0;i<n;i++) 23 { 24 if(f[i]==ans) cnt+=c[i]; 25 if(f[i]>ans) ans=f[i],cnt=c[i]; 26 } 27 printf("%d %d\n",ans,cnt); 28 } 29 return 0; 30 }