//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;
}
SDSC 2017 Day 5 T3
最新推荐文章于 2022-09-18 17:58:23 发布