蒟蒻刷luogu普及试炼场遇到的题orzzz
第一眼看过去是求最长不下降子序列
但是并不是简单的最长不下降子序列,要求输出最长情况下的方案数
于是我们考虑吧开个数组记录对应下标为最后一位时的数目
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[5005], f[5005], t[5005];//a为原序列,f为长度,t为方案数 6 int n, maxn=0; 7 int main(){ 8 memset(f, 0, sizeof(f)); 9 memset(t, 0, sizeof(t)); 10 scanf("%d",&n); 11 for(int i=1; i<=n; i++) scanf("%d",&a[i]); 12 for(int i=1; i<=n; i++){ 13 for(int j=1; j<i; j++){ 14 if(a[i]<a[j]) f[i]=max(f[i], f[j]+1);//求长度 15 } 16 if(!f[i]) f[i]++;//自己本身 17 if(f[i]>maxn) maxn=f[i]; 18 for(int j=1; j<i; j++){ 19 if(f[i]==f[j] && a[i]==a[j]) t[j]=0;//判断是否是同一种 20 else if(f[i]==f[j]+1 && a[i]<a[j]) t[i]+=t[j];//继承上一个的方案数 21 } 22 if(!t[i]) t[i]=1;//自己本身 23 } 24 int ans=0;//记录方案数 25 for(int i=1; i<=n; i++) 26 if(f[i]==maxn) ans+=t[i]; 27 printf("%d %d", maxn, ans); 28 return 0; 29 }