首页 > 其他分享 >dp 未分类题目

dp 未分类题目

时间:2024-02-18 09:04:49浏览次数:30  
标签:count 10 cnt 题目 int 未分类 ++ length dp

2484. Count Palindromic Subsequences

Given a string of digits s, return the number of palindromic subsequences of s having length 5. Since the answer may be very large, return it modulo 109 + 7.

Note:

  • A string is palindromic if it reads the same forward and backward.
  • A subsequence is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters.

Example 1:

Input: s = "103301"
Output: 2
Explanation: 
There are 6 possible subsequences of length 5: "10330","10331","10301","10301","13301","03301". 
Two of them (both equal to "10301") are palindromic.

Example 2:

Input: s = "0000000"
Output: 21
Explanation: All 21 subsequences are "00000", which is palindromic.

Example 3:

Input: s = "9999900000"
Output: 2
Explanation: The only two palindromic subsequences are "99999" and "00000". 

Constraints:

  • 1 <= s.length <= 104
  • s consists of digits.

     

 

class Solution {
    public int countPalindromes(String s) {
        // 计算左侧的两位排列个数
        int[][][] l2r = countLeftToRight(s);
        // 计算右侧的两位排列个数
        int[][][] r2l = countRightToLeft(s);
        int MOD = 1000_000_007;
        long result = 0;
        // 从第3个元素开始,计算左右侧100中情况的count,相加
        for(int i = 2; i < s.length() - 2; i++) {
            for(int j = 0; j < 10; j++) {
                for(int k = 0; k < 10; k++) {
                    result += 1l * l2r[i - 1][j][k] * r2l[i + 1][j][k];
                    result = result % MOD;
                }
            }
        }
        return (int)result;
    }

    private int[][][] countLeftToRight (String s) {
        // 记录当前某数字出现的次数
        int[] cnt = new int[10];
        int[][][] count = new int[s.length()][10][10];
        // i为当前第二个数字的位置
        for(int i = 0; i < s.length(); i++) {
            int c = s.charAt(i) - '0';
            if(i > 0) {
                // j 为第一个数字 0~9
                for(int j = 0; j < 10; j++) {
                    // k 为第二个数字 0~9
                    for(int k = 0; k < 10; k++) {
                        count[i][j][k] = count[i - 1][j][k];
                        // 如果k是当前数字,那么当前的count要加上
                        if(c == k) count[i][j][k] += cnt[j];
                    }
                }
            }
            cnt[c]++;
        }
        return count;
    }

    private int[][][] countRightToLeft (String s) {
        // 记录当前某数字出现的次数
        int[] cnt = new int[10];
        int[][][] count = new int[s.length()][10][10];
        for(int i = s.length() - 1; i >= 0; i--) {
            int c = s.charAt(i) - '0';
            if(i < s.length() - 1) {
                for(int j = 0; j < 10; j++) {
                    for(int k = 0; k < 10; k++) {
                        count[i][j][k] = count[i + 1][j][k];
                        if(c == k) count[i][j][k] += cnt[j];
                    }
                }
            }
            cnt[c]++;
        }
        return count;
    }
}

 

标签:count,10,cnt,题目,int,未分类,++,length,dp
From: https://www.cnblogs.com/cynrjy/p/18018716

相关文章

  • 坐标dp
    就是f[i][j]i和j表示的是第i行第j列与别的没有区别1.传纸条往返两条路,实际上就是从起点分别走两条不相交的路,使其两条路上的总和最大正常的话就用四层循环分别表示两条路各自点的坐标f[x1][y1][x2][y2]=max(f[x1-1][y1][x2-1][y2],f[x1-1][y2][x2][y2-1],f[x1][y1-1][x2-1][y......
  • 动态规划(六)——树形dp
    树形dp,又称树状dp,即在树上进行的dp,在设计动态规划算法时,一般就以节点从深到浅(子树从小到大)的顺序作为dp的“阶段”,dp的状态表示中,第一维通常是节点编号(代表以该节点为根的子树)。大多数时候,我们采用递归的方式实现树形动态规划。对于每个节点x,先递归在他的每个子节点上进行dp,在回溯......
  • 回顾复习之坐标DP
    定义坐标型动态规划一般是给定网格、序列,求满足条件的MAX或MIN。开数组时,dp[i]一般代表以ai结尾的满足条件的子序列,dp[i][j]代表以i、j结尾的满足条件的最优解例题数塔典中典变形晴天小猪历险记之Hill抓苹果免费馅饼矩阵取数描述传送门思路首先看出,每行的问题是独立......
  • 动态规划(五)——坐标dp
    传纸条题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小......
  • DP总结
    DP总结DP(动态规划)简介动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。由于动态规划并**不是某种具体的算法**,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂。DP基础1.必要前提 需要满足三个......
  • 区间dp
    Ø合并:意思就是将两个或多个部分进行整合,当然也可以反过来,也就是是将一个问题进行分解成两个或多个部分。Ø特征:能将问题分解成为两两合并的形式Ø求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。有点类......
  • 区间dp
    合并类动态规划合并:意思就是将两个或多个部分进行整合,当然也可以反过来,也就是是将一个问题进行分解成两个或多个部分。特征:能将问题分解成为两两合并的形式求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优......
  • 区间dp
    1.合并石子(1)排成一列的石子这个与合并果子唯一的不同就是只能合并相邻的石子,所以贪不得(怎么所有类型的动规要先上来搞贪心,有点diss贪心的感觉)f[i][j]表示i到j间合并的最大/最小得分;核心for(intlen=2;len<=n;len++){//表示长度2到len时的最大 for(inti=1;i+len-1<=n;i++)......
  • 背包dp
    01背包描述:有n个物品,每个物品只有一件,第i个物品体积为vi,价格为ci。现在有一个体积为V的背包,请你从n件物品里选出若干件放进背包里,使得背包里的物品价值最大。思路:01背包的特点是:每种物品只有一件,可以选择放或不放。我们可以根据此特点进行动态规划(DP),设f[i][j]表示前i件物品放......
  • 动态规划-DP 完整版
    动态规划学完了五大基础dp做个简单总结dp特征动态规划问题首要是找到做题的目的是求最大/小值还是其他;其二要确定问题的状态转移方程这是关键;第三为dp数组找到边界、最后检查是否需要结合其他相关知识如树dfs等;别忘了检查多测输入数组变量置零等易错点。......