思路:
dp[i][j]表示到第i + 1个位置为止,并且以剩下的所有数字中第j + 1小的数字为结尾所有的合法序列数。
实现:
1 class Solution 2 { 3 public: 4 int numPermsDISequence(string S) 5 { 6 if (S.empty()) return 0; 7 int n = S.length(), MOD = 1e9 + 7; 8 vector<vector<int>> dp(2, vector<int>(n + 1, 0)); 9 for (int i = 0; i <= n; i++) dp[0][i] = 1; 10 for (int i = 1; i <= n; i++) 11 { 12 if (S[i - 1] == 'D') 13 { 14 dp[i & 1][n - i] = dp[i - 1 & 1][n - i + 1]; 15 for (int j = n - i - 1; j >= 0; j--) 16 dp[i & 1][j] = (dp[i & 1][j + 1] + dp[i - 1 & 1][j + 1]) % MOD; 17 } 18 else 19 { 20 dp[i & 1][0] = dp[i - 1 & 1][0]; 21 for (int j = 1; j <= n - i; j++) 22 dp[i & 1][j] = (dp[i - 1 & 1][j] + dp[i & 1][j - 1]) % MOD; 23 } 24 } 25 return dp[n & 1][0]; 26 } 27 }