P1108 低价购买——最长下降子序列+方案数

P1108 低价购买

最长下降子序列不用多讲;关键是方案数;

在求出f[i]时,我们可以比较前面的f[j];

如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重;

这样将所有t[j]加起来就是方案数;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5010;

int n;

int f[maxn],t[maxn];

int  a[maxn];

int ma;

int ans1,ans2;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(a[j]>a[i])
            {
                f[i]=max(f[i],f[j]+1);
            }
        }
        if(!f[i]) f[i]=1;
        if(f[i]>ma) ma=f[i];
        for(int j=1;j<i;j++)
        {
            if(f[i]==f[j]&&a[i]==a[j])
            {
                t[j]=0;
            }
            else if(f[i]==f[j]+1&&a[i]<a[j])
            {
                t[i]+=t[j];
            }
        }
        if(!t[i]) t[i]=1;
    }
    
    for(int i=1;i<=n;i++)
    {
        if(f[i]==ma) 
        {
            ans2+=t[i];
        }
    }
    
    printf("%d %d",ma,ans2);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/WHFF521/p/11750246.html