一拿到这个题感觉很新颖,不过没啥思路。
看了大家的题解,一个$O(n^2\times k)$的做法还是能写一写,虽然过不了。
因为本题所有数字是个全排列,我们设状态是$dp[i][j]$,表示长度为$i$的子序列,以$j$结尾的方案数。
状态转移方程是:$dp[i][j]=\sum_{t=1}^{j-1}dp[i-1][t]$。预处理所有$dp[1][j]$,为了保证$t$都在$j$前面,我们可以边读入边处理。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e3 + 10; typedef long long ll; ll dp[12][maxn]; int main() { int n, k; scanf("%d %d", &n, &k); memset(dp, 0, sizeof(dp)); for(int p = 1; p <= n; p++) { int x; scanf("%d", & x); dp[1][x] = 1; for(int i = 1; i <= k + 1; i++) { for(int t = 1; t <= x - 1; t++) { dp[i][x] += dp[i - 1][t]; } } } ll ans = 0; for(int i = 1; i <= n; i++) { ans += dp[k + 1][i]; } printf("%I64d\n", ans); return 0; }