当前位置: 首页 > news >正文

从递归到动态规划-解码方法Ⅱ

解码方法Ⅱ


Solution

与上一个解码方法的区别就在于分的情况更多更细了,要仔细考虑每一种情况,在递归和dp的思路上面没有什么太大的变化。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
const int mod = 1e9 + 7;//普通递归
int f1(string s, int i) {int n = s.length();if (i >= n) return 1;int ans = 0;if (s[i] == '0') ans = 0;else {if (s[i] != '*') {ans += f1(s, i + 1) % mod;ans %= mod;if (i + 1 < n && s[i + 1] != '*' && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {ans += f1(s, i + 2) % mod;ans %= mod;}else if (i + 1 < n && s[i + 1] == '*') {if (s[i] == '1') { ans += 9 * f1(s, i + 2) % mod; ans %= mod; }if (s[i] == '2') { ans += 6 * f1(s, i + 2) % mod; ans %= mod; }}}else {ans += 9 * f1(s, i + 1) % mod;ans %= mod;if (i + 1 < n && s[i + 1] != '*') {if (s[i + 1] - '0' <= 6) { ans += 2 * f1(s, i + 2) % mod; ans %= mod; }else { ans += f1(s, i + 2) % mod; ans %= mod; }}else if (i + 1 < n && s[i + 1] == '*') {ans += 15 * f1(s, i + 2) % mod;ans %= mod;}}}return ans;
}//带缓存表的递归
long long f2(string s, int i, vector<long long>& dp) {int n = s.length();if (i >= n) return 1;if (dp[i] != -1) return dp[i];long long ans = 0;if (s[i] == '0') ans = 0;else {if (s[i] != '*') {ans += f2(s, i + 1, dp) % mod;ans %= mod;if (i + 1 < n && s[i + 1] != '*' && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {ans += f2(s, i + 2, dp) % mod;ans %= mod;}else if (i + 1 < n && s[i + 1] == '*') {if (s[i] == '1') { ans += 9 * (f2(s, i + 2, dp) % mod); ans %= mod; }if (s[i] == '2') { ans += 6 * (f2(s, i + 2, dp) % mod); ans %= mod; }}}else {ans += 9 * (f2(s, i + 1, dp) % mod);ans %= mod;if (i + 1 < n && s[i + 1] != '*') {if (s[i + 1] - '0' <= 6) { ans += 2 * (f2(s, i + 2, dp) % mod); ans %= mod; }else { ans += f2(s, i + 2, dp) % mod; ans %= mod; }}else if (i + 1 < n && s[i + 1] == '*') {ans += 15 * (f2(s, i + 2, dp) % mod);ans %= mod;}}}dp[i] = ans;return ans;
}//动态规划
int f3(string s) {int n = s.length();vector<long long>dp(n + 1, 0);dp[n] = 1;for (int i = n - 1; i >= 0; --i) {long long ans = 0;if (s[i] == '0') ans = 0;else {if (s[i] != '*') {ans += dp[i + 1] % mod;ans %= mod;if (i + 1 < n && s[i + 1] != '*' && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {ans += dp[i + 2] % mod;ans %= mod;}else if (i + 1 < n && s[i + 1] == '*') {if (s[i] == '1') { ans += 9 * (dp[i + 2] % mod); ans %= mod; }if (s[i] == '2') { ans += 6 * (dp[i + 2] % mod); ans %= mod; }}}else {ans += 9 * (dp[i + 1] % mod);ans %= mod;if (i + 1 < n && s[i + 1] != '*') {if (s[i + 1] - '0' <= 6) { ans += 2 * (dp[i + 2] % mod); ans %= mod; }else { ans += dp[i + 2] % mod; ans %= mod; }}else if (i + 1 < n && s[i + 1] == '*') {ans += 15 * (dp[i + 2] % mod);ans %= mod;}}}dp[i] = ans;}return dp[0];
}int numDecodings1(string s) {return f1(s, 0);
}int numDecodings2(string s) {int n = s.length();vector<long long>dp(n + 2, -1);return f2(s, 0, dp);
}int numDecodings(string s) {return f3(s);
}int main() {return 0;
}

http://www.lryc.cn/news/610956.html

相关文章:

  • 【IDEA】IntelliJ IDEA 中文官方文档全面介绍与总结
  • 以Linux为例补充内存管理基础知识
  • 2025年服务器僵尸攻防战:从AI勒索到量子免疫,构建下一代“数字抗体”
  • Linux 常用命令大全
  • 基于vscode连接服务器实现远程开发
  • vi编辑器makefile的使用以及双向链表
  • 【C++详解】⼆叉搜索树原理剖析与模拟实现、key和key/value,内含优雅的赋值运算符重载写法
  • PHP实战代码解析与应用分享:用户管理、日志,配置管理与文件操作全解析
  • PostgreSQL——插入、更新与删除数据
  • [数组]977.有序数组的平方;209.长度最小的子数组
  • 初始化列表,变量存储区域和友元变量
  • Linux系统目录分析
  • 复杂环境跌倒识别准确率↑31%!陌讯多模态算法在智慧养老的落地实践
  • 2. JS 有哪些数据类型
  • 基于Redis实现短信登录
  • 【CTF】命令注入绕过技术专题:变量比较与逻辑运算
  • Redis Stream:高性能消息队列核心原理揭秘
  • 【OSCP】- eLection 靶机学习
  • 基于ARM+FPGA光栅数据采集卡设计
  • Electron-updater + Electron-builder + IIS + NSIS + Blockmap 完整增量更新方案
  • GPT-1、GPT-2、GPT-3 的区别和联系
  • 7、Redis队列Stream和单线程及多线程模型
  • 人工智能领域、图欧科技、IMYAI智能助手2025年4月更新月报
  • 【RK3576】【Android14】Uboot下fastboot命令支持
  • 创维智能融合终端DT741_移动版_S905L3芯片_安卓9_线刷固件包
  • CTF-XXE 漏洞解题思路总结
  • 测试开发:Python+Django实现接口测试工具
  • Python-初学openCV——图像预处理(七)——亮度变换、形态学变换
  • ThingsKit Edge是什么?
  • 从零实现富文本编辑器#6-浏览器选区与编辑器选区模型同步