题目地址:
https://leetcode.com/problems/number-of-longest-increasing-subsequence/
给定一个长 n n n的数组 A A A,问其最长严格上升子序列的个数。
其实就是动态规划求最优解方案数。设 f [ i ] f[i] f[i]是以 A [ i ] A[i] A[i]为结尾的最长上升子序列的长度, g [ i ] g[i] g[i]是以 A [ i ] A[i] A[i]结尾的长 f [ i ] f[i] f[i]的子序列的个数,那么 f [ i ] = 1 + max j < i , A [ j ] < A [ i ] { f [ j ] } f[i]=1+\max_{j<i,A[j]<A[i]}\{f[j]\} f[i]=1+j<i,A[j]<A[i]max{f[j]}而 g g g可以根据相应情况进行更新。最后看一下哪些 f [ i ] f[i] f[i]等于最长严格上升子序列的长度的,累加它们的 g g g值即可。代码如下:
class Solution {
public:
int findNumberOfLIS(vector<int>& a) {
int n = a.size();
vector<int> f(n), g(n);
int max_len = 0;
for (int i = 0; i < n; i++) {
f[i] = g[i] = 1;
for (int j = 0; j < i; j++)
if (a[j] < a[i]) {
if (f[j] + 1 > f[i]) {
f[i] = f[j] + 1;
g[i] = g[j];
} else if (f[j] + 1 == f[i])
g[i] += g[j];
}
max_len = max(max_len, f[i]);
}
int res = 0;
for (int i = 0; i < n; i++)
if (f[i] == max_len) res += g[i];
return res;
}
};
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( n ) O(n) O(n)。