设有整数序列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个数
第一行输出最大长度n
第二行输出长度为n的序列个数Total
样例输入:
3
1 2 2
样例输出:
2
1
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[1000],a[1000],ans[1000];
int n;
//f[i]表示以a[i]结尾的最长上升子序列的长度
//ans[i]表示以a[i]结尾的最长上升子序列的个数
int main()
{
while(scanf("%d",&n)==1)
{
for(int i=0;i<n;i++){ scanf("%d",&a[i]);f[i]=1;}
/*for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[j]>a[i]&&f[j]<f[i]+1) f[j]=f[i]+1;
}
}*/ //两种方法求最长上升子序列
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(a[j]<a[i]&&f[i]<f[j]+1) f[i]=f[j]+1;
}
}
int _max=0;
for(int i=0;i<n;i++) if(f[i]>_max) _max=f[i];
a[n]=(1<<30);f[n]=_max+1;//添加一个辅助元素 important
for(int i=0;i<n;i++)
{
if(f[i]==1) ans[i]=1;//
else ans[i]=0;
}ans[n]=0;
for(int l=1;l<=_max;l++)
{
for(int i=0;i<n;i++)
{
if(f[i]==l)
{
int j=i+1;
while(j<=n&&a[j]!=a[i])//排除相等情况
{
if(a[j]>a[i]&&f[j]==f[i]+1) ans[j]+=ans[i];
j++;
}
}
}
}
printf("%d/n%d/n",_max,ans[n]);
}
return 0;
}