求最长下降子序列的个数,注意完全相同的序列不重复计算
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define speed(x) ios::sync_with_stdio(false), cin.tie(x), cout.tie(x)
#define bug(x) cout << #x << " == " << x << '\n'
const ll int maxn = 5e3+ 5;
#define ls p * 2
#define rs p * 2 + 1
#define md (l + r) / 2
using namespace std;
ll mod = 998244353;
int a[maxn] = { 0 };
int dp[maxn] = { 0 };
int pos[maxn] = { 0 };
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d", &a[i]);
}
dp[1] = 1;
int ans = 1;
for(int i=2;i<=n;i++)
{
dp[i] = 1;
for(int j=1;j<i;j++)
{
if(a[i]<a[j])
{
dp[i]=max(dp[j]+1,dp[i]);
}
}
ans=max(ans,dp[i]);
}
pos[1] = 1;
int ans2 = 0;
for(int i=1;i<=n;i++)
{
if(dp[i]==1)
{
pos[i] = 1;
}
for(int j=1;j<i;j++)
{
if(dp[i]==dp[j]+1&&a[i]<a[j])
{
pos[i] += pos[j];
}
else if(dp[i]==dp[j]&&a[i]==a[j])
{
pos[i] = 0;
}
}
if(dp[i]==ans)
{
ans2 += pos[i];
}
}
printf("%d %d\n",ans,ans2);
}