zoukankan      html  css  js  c++  java
  • leetcode 903. DI序列的有效排列

    题目描述:

    我们给出 S,一个源于 {'D', 'I'} 的长度为 n 的字符串 。(这些字母代表 “减少” 和 “增加”。)
    有效排列 是对整数 {0, 1, ..., n} 的一个排列 P[0], P[1], ..., P[n],使得对所有的 i:

    如果 S[i] == 'D',那么 P[i] > P[i+1],以及;
    如果 S[i] == 'I',那么 P[i] < P[i+1]。
    有多少个有效排列?因为答案可能很大,所以请返回你的答案模 10^9 + 7.

    示例:

    输入:"DID"
    输出:5
    解释:
    (0, 1, 2, 3) 的五个有效排列是:
    (1, 0, 3, 2)
    (2, 0, 3, 1)
    (2, 1, 3, 0)
    (3, 0, 2, 1)
    (3, 1, 2, 0)

    提示:

    1. 1 <= S.length <= 200
    2. S 仅由集合 {'D', 'I'} 中的字符组成。

    思路分析:

    我们用 dp(i, j) 表示确定了排列中到 P[i] 为止的前 i + 1 个元素,并且 P[i] 和未选择元素的相对大小为 j 的方案数(即未选择的元素中,有 j 个元素比 P[i] 小)。在状态转移时,dp(i, j) 会从 dp(i - 1, k) 转移而来,其中 k 代表了 P[i - 1] 的相对大小。如果 S[i - 1] 为 D,那么 k 不比 j 小;如果 S[i - 1] 为 I,那么 k 必须比 j 小。

    代码:

     1 class Solution {
     2 public:
     3     int mod = 1e9+7;
     4     int numPermsDISequence(string S) {
     5         int n = S.size();
     6         if(n==0)
     7             return 0;
     8         vector<vector<int>> dp(n+1, vector<int>(n+1, 0));
     9         for(int i=0; i<n+1; i++)
    10             dp[0][i]=1;
    11         for(int i=1; i<=n; i++)
    12         {
    13             for(int j=0; j<=i; j++)
    14             {
    15                 if(S[i-1]=='D')
    16                 {
    17                     for(int k=j; k<i; k++)
    18                     {
    19                         dp[i][j] += dp[i-1][k];
    20                         dp[i][j] %= mod;
    21                     }
    22                 }
    23                 else
    24                 {
    25                     for(int k=0; k<j; k++)
    26                     {
    27                         dp[i][j] += dp[i-1][k];
    28                         dp[i][j] %= mod;
    29                     }
    30                 }
    31             }
    32         }
    33         int ans = 0;
    34         for(int i=0; i<=n; i++)
    35         {
    36             ans += dp[n][i];
    37             ans %= mod;
    38         }
    39         return ans;
    40     }
    41 };
  • 相关阅读:
    svn 回退/更新/取消至某个版本命令详解
    SVN版本回退
    用Visual Studio编辑Linux代码
    vim——打开多个文件、同时显示多个文件、在文件之间切换
    vim下的ctags和taglist等的使用和配置
    Uber优步北京第二、三组奖励政策
    Uber优步北京第一组奖励政策
    uber在限制新司机加入了,看看新政策把
    软件架构 "4+1" 视图模型
    软件体系结构经典问题——KWIC的分析和解决
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11491684.html
Copyright © 2011-2022 走看看