把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解:低价购买

蒟蒻刷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 }

 

posted @ 2018-10-30 20:38  AZe-qwq  阅读(150)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end