//此题难点在于求不能重复的种数
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[5002],f[5002],cnt[5002];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
f[i]=1;
cnt[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=i-1;j>=1;j--) //从后往前判断,防止重复
{
if(a[j]>a[i])
{
if(f[j]+1>f[i]){
f[i]=f[j]+1;
cnt[i]=cnt[j];//继续连接
}else if(f[j]+1==f[i]){ //如果有重复的话已经提前化为0,故无重复
cnt[i]+=cnt[j];
}
}else if(a[j]==a[i])
{
if(f[i]==1)
cnt[i]=0; //a[i]和a[j]前面接的数一样
break;//无需重复判断a[j]前面的数
}
}
}
int maxn=0,ans=0;
for(int i=1;i<=n;i++)
{
if(f[i]>maxn)
maxn=f[i];
}
for(int i=1;i<=n;i++)
{
if(f[i]==maxn)
ans+=cnt[i];
}
printf("%d %d\n",maxn,ans);
return 0;
}
poj1952(dp+想法)
最新推荐文章于 2019-10-14 00:10:14 发布