SDSC 2017 Day 5 T3

来源:互联网 发布:知乎 陈廖宇 编辑:程序博客网 时间:2024/06/05 06:30
//dp1[i]是以i结尾的最长下降子序列的长度 //dp2[i]是以i结尾的...的方案数 #include<bits/stdc++.h>using namespace std;const int maxn = 5010;int n, ans, tot;int dp1[maxn], dp2[maxn], a[maxn];int main(){    scanf("%d", &n);    //getInit();    for(int i = 1; i <= n; i++){        scanf("%d", &a[i]);        dp1[i] = 1;        for(int j = 1; j < i; j++)            if(a[j] > a[i]) dp1[i] = max(dp1[i], dp1[j]+1);        ans = max(dp1[i], ans);    }    for(int i = 1; i <= n; i++){        if(dp1[i] == 1) dp2[i] = 1;        for(int j = 1; j < i; j++){            if(dp1[i] == dp1[j] + 1 && a[i] < a[j]) dp2[i] += dp2[j];            if(dp1[i] == dp1[j] && a[i] == a[j])    dp2[i] = 0;//判重,此条件说明i, j之间没有符合条件的数,说明两个序列是一样的         }    }    for(int i = 1; i <= n; i++)        if(dp1[i] == ans)   tot += dp2[i];    printf("%d %d\n", ans, tot);    return 0;}