题目

https://www.luogu.org/problemnew/show/P1108

思路

f[序号]=最长长度

c[序号]=方法数量

当f[i]=f[j]+1,且数字满足大小关系时,c[i]+=c[j]

当f[i]=f[j],且数字相等时,c[j]=0,避免重复计算

代码

#include<iostream>  
#include<cstdio>  
#include<algorithm>  
#include<cmath>  
using namespace std;  
long long f[6000];  
long long c[6000];  
int cnt=0;  
int n;  
long long a[6000];  
int main(){  
    scanf("%d",&n);  
    int i,j;  
    for(i=1;i<=n;i++){  
        scanf("%d",&a[i]);  
    }  
    int max1=0;  
    for(i=1;i<=n;i++){  
        for(j=1;j<i;j++) if(a[i]<a[j] && f[i]<f[j]+1)f[i]=f[j];  
        f[j]++;  
        if(f[j]==1)c[j]=1;  
        for(j=1;j<i;j++){  
            if(a[i]<a[j] && f[i]==f[j]+1){  
                c[i]+=c[j];   
            }  
            else if(a[i]==a[j] && f[i]==f[j]) c[j]=0;  
        }  
        if(f[i]>max1)max1=f[i];  
    }  
    for(i=1;i<=n;i++){  
        if(f[i]==max1)cnt+=c[i];  
    }  
    printf("%d %d",max1,cnt);  
    return 0;  
}