Subsequences

一拿到这个题感觉很新颖,不过没啥思路。

看了大家的题解,一个$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;
}
Code

相关文章:

  • 2021-06-28
  • 2022-01-08
  • 2021-06-06
  • 2021-12-01
  • 2021-05-31
  • 2021-09-17
  • 2021-09-30
猜你喜欢
  • 2021-12-23
  • 2021-07-26
  • 2021-04-25
  • 2021-05-15
  • 2021-08-01
  • 2022-01-01
  • 2021-11-06
相关资源
相似解决方案