- 最长上升改为最长下降
- 计算该长度的序列个数
- 计算序列个数时不能重复
输入样例1:
12
68 69 54 64 68 64 70 67 78 62
98 87
输出样例1:
4 2
输入样例2:
5
4 3 2 1 1
输出样例2:
4 1
#include <iostream>
using namespace std;
const int N = 5010;
int a[N],f[N],g[N];
int main()
{
int n;cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
g[0] = 1;
for (int i = 1; i <= n; i ++ )
{
for (int j = 0; j < i; j ++ )
if (!j || a[j] > a[i])
f[i] = max(f[i], f[j] + 1);
for (int j = 1; j < i; j ++ )
if (a[j] == a[i])
f[j] = 0;
for (int j = 0; j < i; j ++ )
if ((!j || a[j] > a[i]) && f[i] == f[j] + 1)
g[i] += g[j];
}
int res = 0, cnt = 0;
for (int i = 1; i <= n; i ++ ) res = max(res, f[i]);
for (int i = 1; i <= n; i ++ )
if (f[i] == res)
cnt += g[i];
cout << res << ' ' << cnt << endl;
return 0;
}