最长递减子序列的加强版,本题中序列相同的算是同一种 比如3211,最后一个1就可以不计数。所以这里面还需要特殊判断。
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 5001
using namespace std;
int n,arr[N],dp[N],num[N];
int Max(int a1,int b1)
{
return a1>b1?a1:b1;
}
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",arr+i);
getchar();
}
for(int i=1;i<=n;++i)
{
dp[i]=num[i]=1;
}
for(int i=1;i<=n;++i)
{
for(int j=i-1;j>0;--j)
if(arr[i]<arr[j])
{
if(dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
num[i] = num[j];
}
else if(dp[j]+1==dp[i])
{
num[i] += num[j];
}
}
else if(arr[i]==arr[j])
{
if(dp[i]==1)
num[i] = 0;
break;
}
}
int ans = 0,sum = 0;
for(int i=1;i<=n;++i)
{
if(dp[i]==ans)
{
sum += num[i];
}
else if(dp[i]>ans)
{
ans = dp[i];
sum = num[i];
}
}
cout<<ans<<" "<<sum<<endl;
return 0;
}