描述
设有整数序列b1,b2,b3,…,bm,若存在i1<i2<i3<…<in,且bi1<bi2<bi3<…<bin,则称 b1,b2,b3,…,bm中有长度为n的不下降序列bi1,bi2,bi3,…,bin。求序列b1,b2,b3,…,bm中所有长度(n)最大不下降子序列
具有相同元素的序列,我们称之为重复序列,这里我们不统计重复序列,也即是说,重复的是算一次
具有相同元素的序列,我们称之为重复序列,这里我们不统计重复序列,也即是说,重复的是算一次
输入格式
第一行为m,表示m个数(m<=900)
第二行m个数
第二行m个数
输出格式
第一行输出最大长度n
第二行输出长度为n的序列个数Total
第二行输出长度为n的序列个数Total
测试样例1
输入
3
1 2 2
输出
2#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define M 910 int n,cnt[M],dp[M],map[M],ans,c; bool vis[M]; int main(){ cin >>n; for(int i=1;i<=n;i++){ scanf("%d",&map[i]); dp[i]=cnt[i]=1; } for(int i=1;i<=n;i++){ for(int j=i-1;j>=1;j--){ if(map[i]==map[j]) break; if(map[i]>map[j]){ if(dp[i]<dp[j]+1){ dp[i]=dp[j]+1; cnt[i]=cnt[j]; } else if(dp[i]==dp[j]+1) cnt[i]+=cnt[j]; } } } for(int i=1;i<=n;i++) if(ans<=dp[i]) ans=dp[i]; for(int i=1;i<=n;i++){ if(dp[i]==ans&&vis[dp[i]]==0){ c+=cnt[i]; vis[map[i]]=true; } } printf("%d\n%d\n",ans,c); return 0; }
1