首页 > 其他分享 >区间DP-前缀和优化-2478. 完美分割的方案数

区间DP-前缀和优化-2478. 完美分割的方案数

时间:2022-11-26 20:56:44浏览次数:52  
标签:分割 前缀 完美 minLength 2478 DP 字符串 2357 dp

问题描述

给你一个字符串 s ,每个字符是数字 '1' 到 '9' ,再给你两个整数 k 和 minLength 。

如果对 s 的分割满足以下条件,那么我们认为它是一个 完美 分割:

s 被分成 k 段互不相交的子字符串。
每个子字符串长度都 至少 为 minLength 。
每个子字符串的第一个字符都是一个 质数 数字,最后一个字符都是一个 非质数 数字。质数数字为 '2' ,'3' ,'5' 和 '7' ,剩下的都是非质数数字。
请你返回 s 的 完美 分割数目。由于答案可能很大,请返回答案对 109 + 7 取余 后的结果。

一个 子字符串 是字符串中一段连续字符串序列。

示例 1:

输入:s = "23542185131", k = 3, minLength = 2
输出:3
解释:存在 3 种完美分割方案:
"2354 | 218 | 5131"
"2354 | 21851 | 31"
"2354218 | 51 | 31"
示例 2:

输入:s = "23542185131", k = 3, minLength = 3
输出:1
解释:存在一种完美分割方案:"2354 | 218 | 5131" 。
示例 3:

输入:s = "3312958", k = 3, minLength = 1
输出:1
解释:存在一种完美分割方案:"331 | 29 | 58" 。

提示:

1 <= k, minLength <= s.length <= 1000
s 每个字符都为数字 '1' 到 '9' 之一。

问题求解

dp[i][j]: 前j个字符划分成i段分割数目。
为了方便转移,我们将s可以从下标1开始,下标0表示前0个字符,方便转移。
核心的难点在于如何优化dp,这里使用了常用技巧前缀和优化来加速迭代进程。

class Solution:
    def beautifulPartitions(self, s: str, k: int, minLength: int) -> int:
        if k * minLength > len(s) or s[0] not in "2357" or s[-1] in "2357":
            return 0

        MOD = 10 ** 9 + 7
        n = len(s)
        s = "#" + s

        dp = [[0] * (n + 1) for _ in range(k + 1)]
        dp[0][0] = 1
        for i in range(1, k + 1):
            presum = 0
            for j in range(i * minLength, n + 1):
                if s[j - minLength + 1] in "2357" and s[j - minLength] not in "2357":
                    presum += dp[i - 1][j - minLength]
                    presum %= MOD
                if s[j] not in "2357":
                    dp[i][j] += presum 

        return dp[k][n]

标签:分割,前缀,完美,minLength,2478,DP,字符串,2357,dp
From: https://www.cnblogs.com/hyserendipity/p/16928265.html

相关文章

  • rinetd tcp/udp 端口重定向服务
    rinetd支持tcp以及udp协议的端口重定向,功能还是比较有用的,比如进行一些流量转发,配置上也是比较方便的,同时支持一些简单的访问控制处理构建 gitcloneht......
  • dp完全背包问题解组合问题——零钱兑换
    本题为完全背包问题,遍历容量需要顺序遍历classSolution{public:intchange(intamount,vector<int>&coins){//完全背包顺序遍历//背包容量为a......
  • wordpress代码实现相关文章的几种方法
    我们在制作wordpress主题的时候经常会为文章模板添加一些相关文章的功能丰富,他们有的时候出现在侧栏,有的时候出现在文章的底部相关文章这块,当然WordPress相关文章的插件也......
  • 一种通过udp进行无确认ip的双向的通信
    前言udp是一种不可靠的通信,但是有些时候还是会有使用。今天分享一个示例:主体逻辑,一个端口广播地址,接收到ip地址数据后,其他端口基于这个ip进行bind绑定,最后通信,这样可以保......
  • Educational DP Contest——J 期望dp
    题目链接https://atcoder.jp/contests/dp/tasks/dp_jAC代码点击查看代码#include<bits/stdc++.h>#definerep(i,x,y)for(inti=x;i<=y;++i)#defineper(i,x,y)f......
  • Golang中一个不错的处理 JSON 的库 go-dproxy
    国庆七天,你是吃多了,还是睡多了?放假七天转眼即逝,接下来的七天可能你又觉得会很漫才。言归正传。Golang虽然自己就带了JSON(encoding/json)处理的库,也有第三方的simplejs......
  • 分享WordPress博客搜索引擎优化的六点经验
    wordpress是非常不错的博客程序,也是很多博客爱好者所喜欢的建站程序之一,wordpress不仅仅模版丰富,而且有足够的插件可以供我们选择,wordpress在搜索引擎......
  • Job for xrdp.service failed because the control process exited with error code.x
    ​解决方法:touch/var/log/xrdp.logchownxrdp:adm/var/log/xrdp.logchmod640/var/log/xrdp.logReboot systemctlstartxrdpsystemctlstatusxrdp 来自......
  • WordPress 主题教程 #5c:日志元数据
    日志元数据是从零开始创建WordPress主题系列教程的五篇的第三部分,今天我们将开始讲解日志的元数据(Postmetadata):日期(date),分类(categories),作者(author),评论数(numberofcomment......
  • WordPress 主题教程 #6:侧边栏
    侧边栏是从零开始创建WordPress主题系列教程的第六篇,这一篇我们主要讲解WordPress主题的侧边栏,让你很快掌握它的结构,并能编码和样式化它。在开始侧边栏之前,这是现在in......