2 条题解

  • 0
    @ 2025-10-8 16:59:50

    dfs版:

    #include <bits/stdc++.h>
    using namespace std;
    typedef __int128 int128;
    int128 f[50][50];
    int128 dfs(int n, int k)
    {
        if (k == 1 || n == k) return 1;
        if (f[n][k] != 0) return f[n][k];
        return f[n][k] = dfs(n - 1, k - 1) + k * dfs(n - 1, k);
    }
    template <typename T> void qw(T x)
    {
        if (x > 9) qw(x / 10);
        putchar(x % 10 + 48);
    }
    int main()
    {
        int n, k; scanf("%d%d", &n, &k);
        memset(f, 0, sizeof(f));
        qw(dfs(n, k));
        return 0;
    }
    

    常规版:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 55;
    __int128 f[N][N];
    template <typename T> void qw(T x)
    {
        if (x / 10) qw(x / 10);
        putchar(x % 10 + 48);
    }
    int main()
    {
        int n, m; scanf("%d%d", &n, &m);
        f[0][0] = 1;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= i; j++)
                f[i][j] = f[i - 1][j - 1] + j * f[i - 1][j];
        qw(f[n][m]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:59:40

      dfs版:

      #include<bits/stdc++.h>
      using namespace std;
      typedef __int128 int128;
      int128 f[50][50];
      int128 dfs(int n,int k)
      {
          if(k==1||n==k)return 1;
          if(f[n][k]!=0)return f[n][k];
          return f[n][k]=dfs(n-1,k-1)+k*dfs(n-1,k);
      }
      template<typename T>void qw(T x)
      {
      	if(x>9)qw(x/10);
      	putchar(x%10+48);
      }
      int main()
      {
          int n,k;scanf("%d%d",&n,&k);
          memset(f,0,sizeof(f));
          qw(dfs(n,k));
          return 0;
      }

      常规版:

      #include<bits/stdc++.h>
      using namespace std;
      const int N = 55;
      __int128 f[N][N];
      template<typename T>void qw(T x)
      {
      	if(x/10)qw(x/10);
      	putchar(x%10+48); 
      }
      int main()
      {
      	int n, m;scanf("%d%d",&n,&m);
      	f[0][0]=1;
      	for(int i=1; i<=n; i++)
      		for(int j=1; j<=i; j++)
      			f[i][j]=f[i-1][j-1]+j*f[i-1][j];
      	qw(f[n][m]);
      	return 0;
      }


      • 1

      *【动态规划:区间二维一边推】集合的划分

      信息

      ID
      2034
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      96
      已通过
      26
      上传者