zoukankan      html  css  js  c++  java
  • 动态规划-计数dp-Distinct Subsequences II

    2020-02-06 17:01:36

    问题描述:

    问题求解:

    非常经典的计数dp问题,思路就是统计以每个字符为结尾的个数,最后求和即可。

    dp[i] = sum of (dp[j]) 0 <= j <= i;可以理解为将最后的一个字符追加到前面的字符串后面。

    问题是如何去重。

    当我们遇到相同的字符的时候,首先最后一个字符单独最为subseq要删除,因为前面计算过了,其次,只能加到第一次碰到形同字符的位置,因为再前面的在这个重复字符的位置已经计算过了。

        int mod = (int)1e9 + 7;
        public int distinctSubseqII(String S) {
            int n = S.length();
            int[] dp = new int[n];
            Arrays.fill(dp, 1);
            for (int i = 0; i < n; i++) {
                for (int j = i - 1; j >= 0; j--) {
                    if (S.charAt(i) != S.charAt(j)) dp[i] = (dp[i] % mod + dp[j] % mod) % mod;
                    else {
                        dp[i] -= 1;
                        dp[i] = (dp[i] % mod + dp[j] % mod) % mod;
                        break;
                    }
                }
            }
            int res = 0;
            for (int i = 0; i < n; i++) res = (res % mod + dp[i] % mod) % mod;
            return res;
        }
    

      

  • 相关阅读:
    iOS 快语句(block)浅析
    iOS中控制器的创建
    iOS中的截屏
    iOS&UITextView中的placeholder属性
    iOS归档,解档
    iOS内存警告浅析
    scrollWidth,clientWidth,offsetWidth的区别
    css3学习笔记
    页面重构的常用规范
    页面重构的职业定位
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12269415.html
Copyright © 2011-2022 走看看