其他分享
首页 > 其他分享> > LeetCode 903: DI序列的有效排列

LeetCode 903: DI序列的有效排列

作者:互联网

S 是由 ‘D’ 和 ‘I’ 构成的长度为 n 的字符串,P 是整数 0 : n 的一个排列,满足:
对任意的 i,若S[i] = ‘D’,则 P[i] > P[i+1];若 S[i] = ‘I’,则 P[i] < P[i+1]。
求满足条件的 P 的排列的个数,输出结果取1e9 + 7的模。

暴力的解法是用 next_permutation() 枚举 0 : n 的所有排列,若符合条件计数+1,运行结果超时。

LeetCode 903 的官方题解没有看懂,本文的思路基于https://blog.csdn.net/AzureoSky/article/details/82722114。
个人理解动态规划的关键在于找到递推公式,而递推的关键在于确定DP[i][j]的意义。定义 DP[i][j]:将整数 0 : i ( i + 1 个数)根据 S 的前 i 个字符排列,且 j (0 ≤ j ≤ i) 排在末尾(即第 i + 1 位)的排列的个数。接下来需要思考 DP[i][j] 和其他状态之间的关系,在这之前我们来看这样一组示例:
已知 S = “IDDID” ,满足 DP[4][3] 一个排列 P 是 1 4 2 0 3,在寻找满足 DP[5][3] 的排列时,将排列 P 中大于等于 3 的数 +1,并把 3 置于末尾,得到 1 5 2 0 4 3,是一个既满足前 4 个字符、又符合第 5 个字符的排列。可以推得,满足 DP[4][3]、DP[4][4] 的排列,根据上述方法在排列的末尾添加 3 ,即可得到满足 DP[5][3] 的排列。因此,当 S[i-1] 是 ‘D’ 时,DP[i][j] = DP[i-1][j] + DP[i-1][j+1] + … + DP[i-1][i-1]
若 S = “IDDII” ,在寻找满足 DP[5][4] 的排列时,同样的方法将 4 置于排列末,得到的 1 5 2 0 3 4,符合条件。可以推得,满足 DP[4][3]、DP[4][2]、DP[4][1]、DP[4][0] 的排列,根据上述方法在排列的末尾添加 4 ,即可得到满足 DP[5][4] 的排列。因此,当 S[i-1] 是 ‘I’ 时,DP[i][j] = DP[i-1][0] + DP[i-1][1] + … + DP[i-1][j-1]
可以看到,每一步递推的结果 DP[i][j] 只和 S 中第 i 个字符有关,这是动态规划“子问题独立”的体现。基于上述递推公式得到 DP 二维矩阵,DP[n] 的和即满足 S 的排列的个数。该算法的时间复杂度是 O(n^3)。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int numPermsDISequence(string S) {
    int n = S.size();
    int mod = 1e9+7;
    vector<vector<int>> DP(n + 1, vector<int>(n + 1, 0));
    DP[0][0] = 1;
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j <= i; ++j) {
            if (S[i - 1] == 'D') {
                for (int k = j; k < i; ++k) {
                    DP[i][j] += DP[i - 1][k];
                    DP[i][j] %= mod;
                }
            }
            if (S[i - 1] == 'I') {
                for (int k = 0; k < j; ++k) {
                    DP[i][j] += DP[i - 1][k];
                    DP[i][j] %= mod;
                }
            }
        }
    }
    int sum = 0;
    for(int i = 0;i <= n;++i) {
        sum += DP[n][i];
        sum %= mod;
    }
    return sum;
}

标签:903,排列,DI,int,满足,个字符,递推,LeetCode,DP
来源: https://blog.csdn.net/weixin_39566854/article/details/100702839