leetcode:2478. 完美分割的方案数【预处理 + dp定义 + 前缀和优化】
创始人
2024-02-07 01:50:05

目录

  • 题目截图
  • 题目分析
  • ac code
  • 总结

题目截图

在这里插入图片描述

题目分析

  • 开头必定是prime,结尾必定是not prime
  • k = 1特判
  • 找到所有可能的结尾点(最后一个不考虑)
  • 结尾点i必须满足s[i]->not prime, s[i + 1]->prime
  • 设结尾点集合为x
  • 0 <= x1 < x2 < … < xm <= n - 1 选k - 1个点
  • 不妨设为b1, b2, … b(k - 1), 满足
  • 1.b1 + 1 >= minLength
  • 2.bi - b(i - 1) >= minLength, i belongs to [1, k - 1]
  • 3.n - 1 - b(k - 1) >= minLength
  • 那么,这大概可以考虑dp
  • 变量有前i个结束点,第j个实际结束段,minLength为定值不考虑
  • 那么,dp[i][j]表示第i个结束点作为第j个结束段点的个数
  • 答案为所有满足i作为n - 1 - x[i] >= minLength,的dp[i][-1]之和
  • 转移方程:对于dp[i][j]而言,找到所有的i2使得x[i] - x[i2] >= minLength,那么dp[i][j] = sum(dp[i2][j - 1])
  • i2的找法显然是一个简单二分,那么sum(dp[i2][j])显然就是一个前缀和
  • 也就是说,在得到当前dp[i][j]的时候要维护一个第j列的前缀和,减少一层复杂度

ac code

提交的代码: 17 小时前
语言: python3添加备注class Solution:def beautifulPartitions(self, s: str, k: int, minLength: int) -> int:MOD = 10 ** 9 + 7n = len(s)primes = {'2', '3', '5', '7'}if s[0] not in primes or s[-1] in primes:return 0if k == 1:return int(s[0] in primes and s[-1] not in primes and len(s) >= minLength)# 可能的结束点j, 0 <= j < n - 1, j非质数 j + 1质数end_points = []for j, v in enumerate(s):if j < n - 1:if s[j] not in primes and s[j + 1] in primes:end_points.append(j)#print(end_points)x = end_pointsm = len(end_points)if m < k - 1:return 0# 0 <= x1 < x2 < ... < xm <= n - 1 选k - 1个点# 不妨设为b1, b2, ... b(k - 1), 满足# 1.b1 + 1 >= minLength# 2.bi - b(i - 1) >= minLength, i belongs to [1, k - 1]# 3.n - 1 - b(k - 1) >= minLength# dp[i][j]表示第i个结束点作为第j个结束段点的个数# dp[i][k]求和,其中n - 1 - x[i] >= minLengthdp = [[0] * (k - 1) for _ in range(m)]col_preSum = [[0] * (k - 1) for _ in range(m)] # 每列的前缀和优化for i in range(m): #initif x[i] + 1 >= minLength:#print(i, k, m)dp[i][0] = 1if i == 0:col_preSum[i][0] = dp[i][0]else:col_preSum[i][0] = col_preSum[i - 1][0] + dp[i][0]# 20221120我觉得大概能做出来把for i in range(m):for j in range(1, k - 1):# 本质上是一个j - 1列的前缀和# for i2 in range(i):#     if x[i] - x[i2] >= minLength:#         dp[i][j] += dp[i2][j - 1]#         dp[i][j] %= MODcheck_point = x[i] - minLengthi2 = bisect_right(x, check_point)if i2 == 0: # 找不到dp[i][j] == 0else: # 找到dp[i][j] += col_preSum[i2 - 1][j - 1]if i == 0:col_preSum[i][j] = dp[i][j]else:col_preSum[i][j] = col_preSum[i - 1][j] + dp[i][j]ans = 0for i in range(m):if n - 1 - x[i] >= minLength:ans += dp[i][-1]ans %= MODreturn ans % MOD

总结

  • 预处理找分割点 + dp定义二维 + 前缀和优化
  • 从这道题我看到了自己的进步。。。

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...