Advertisement
pb_jiang

LC1621

Jan 15th, 2023
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. class Solution
  2. {
  3.     const int mod = 1e9 + 7;
  4.     vector<vector<array<int, 2>>> dp;
  5.     int search(int n, int k, int end)
  6.     {
  7.         if (n == k)
  8.             return end == 1;
  9.         if (n < k)
  10.             return dp[n][k][end] = 0;
  11.         if (k == 0)
  12.             return end == 0;
  13.         if (n < 0)
  14.             return 0;
  15.         if (dp[n][k][end] != -1)
  16.             return dp[n][k][end];
  17.  
  18.         int ret = 0;
  19.         // end 1: the end is occupied
  20.         // end 0: the end is not occupied
  21.         switch (end) {
  22.             case 0:
  23.                 ret = (ret + search(n - 1, k, 0)) % mod; // not take i
  24.                 ret = (ret + search(n - 1, k, 1)) % mod; // not take i
  25.                 break;
  26.             case 1:
  27.                 ret = (ret + search(n - 1, k - 1, 0)) % mod; // take i, and make it a single group
  28.                 ret = (ret + search(n - 1, k - 1, 1)) % mod; // take i, and make it a single group
  29.                 ret = (ret + search(n - 1, k, 1)) % mod;     // take i, and make it a suffix to previous group
  30.                 break;
  31.         }
  32.         return dp[n][k][end] = ret;
  33.     }
  34.  
  35.   public:
  36.     int numberOfSets(int n, int k)
  37.     {
  38.         dp = vector<vector<array<int, 2>>>(n + 1, vector<array<int, 2>>(k + 1, array<int, 2>{-1, -1}));
  39.         return (search(n - 1, k, 0) + search(n - 1, k, 1)) % mod;
  40.     }
  41. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement