一道集众多技巧于一身的题目——《密文游戏》

本文详细解析了一道结合多种算法技巧的题目——《密文游戏》,涉及动态规划、状态转移、空间复杂度优化、大数运算优化等。通过分析和实现过程,介绍了如何运用动态规划解决方案统计问题,并逐步优化代码,降低空间复杂度和提高运算效率。
摘要由CSDN通过智能技术生成

小伙伴们好,卷卷毛又来了,今天来分享一个非常具有技巧性的题目。

这是一道状态统计题目,同时兼具了若干技巧,有优化空间复杂度的数组减维,还有处理超大数据运算的高精度以及压位处理…也许这些技巧中有小伙伴们不熟悉的词汇,不过不要紧张,在下面对题目的分析中,我们会一一讨论到。
在这里插入图片描述

题面

那我们话不多说,先看题目:
在这里插入图片描述
时空限制:
在这里插入图片描述
输入样例:

1414
BE

输出样例:

3

分析与实现

题目大意是,给定两个字符串作为原文和密文。译码后,密文为原文的一个子序列(注意不是子串,不必在原文中连续出现)。问将密文还原为原文有多少种还原方式。

分析

简单分析题目,在将源码转成译码之后就是一道方案统计的问题。一般来说,方案统计的问题也需要借助状态之间的转移,所以我们也总是将这种方案统计的问题与动态规划问题统称为DP,尽管这类问题不涉及最优解。

所以,这个问题我们依旧可以使用之前用来解决动态规划问题的思想,在状态转移的过程中完成对结果方案的统计,即:定状态,找转移,初始化。

(顺便打个广告,之前动态规划相关的文章在这里:区间动态规划 例题与解析最短路径的方案数统计问题(基于floyd算法) 背包dp问题:背包九讲
在这里插入图片描述
好了,我们言归正传~

定状态

对于这个问题,我们可以定义状态:
d p [ i ] [ j ] ( j ≤ i , 0 ≤ i ≤ n , 0 ≤ j ≤ m ) n = l e n ( A ) m = l e n ( B ) dp[i][j](j \le i,0 \le i \le n,0 \le j \le m) \\ n = len(A) \\ m = len(B) dp[i][j](ji,0in,0jm)n=len(A)m=len(B)
表示 a 1 a 2 . . a i a_1a_2..a_i a1a2..ai b 1 b 2 . . b j b_1b_2..b_j b1b2..bj补全匹配的方案数

找转移

定义好了状态,来处理状态间的转移。

可以分成两种情况:

  • a i a_i ai b j b_j bj不相同时, d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i - 1][j] dp[i][j]=dp[i1][j],即最后一位不匹配,方案数同上一位 a i − 1 a_{i-1} ai1匹配到 b j b_j bj相同。
  • a i a_i ai b j b_j bj相同时, d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + d p [ i − 1 ] [ j ] dp[i][j]=dp[i - 1][j - 1] + dp[i - 1][j] dp[i][j]=dp[i1][j1]+dp[i1][j],即可以取最后一位不匹配,方案数同上;加上可以取最后一位匹配,方案数取上一位 a i − 1 a_{i-1}
  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值