当前位置: 首页 > 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.dtcms.com/a/316852.html

相关文章:

  • 软件测试面试如何避坑呢?
  • 8.5 各种攻击实验
  • 使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%
  • 无人机陀螺仪模块技术解析
  • SQL的LEFT JOIN优化
  • 【C语言】动态内存管理详解
  • Centos7 、9 、OpenEuler 22、24对比
  • TCP协议与UDP协议
  • 十六、请求响应-响应:三层架构-分层解耦
  • 信息安全的概述
  • RabbitMQ延时队列的两种实现方式
  • C++算法竞赛篇(九)字符数组题型讲解
  • 坚鹏:AI智能体软件是知行学成为AI智能体创新应用引领者的抓手
  • uvm-register-backdoor-access
  • SpringBoot AI心理学训练实战
  • 更改CodeBuddy的默认terminal为Git Bash
  • 随机森林算法详解:从集成学习原理到代码实现
  • Java技术栈/面试题合集(11)-设计模式篇
  • java web 未完成项目,本来想做个超市管理系统,前端技术还没学。前端是个简单的html。后端接口比较完善。
  • MySQL内外连接详解
  • 学习笔记-相似度匹配改进2
  • 机器学习——随机森林
  • Python高级编程与实践:Python高级数据结构与编程技巧
  • 【C++】Stack and Queue and Functor
  • C++二级考试核心知识点【内附操作题真题及解析】
  • Juc高级篇:可见性,有序性,cas,不可变,设计模式
  • SpringMVC(一)
  • Design Compiler:布图规划探索(ICC)
  • 《失落王国》v1.2.8中文版,单人或联机冒险的低多边形迷宫寻宝游戏
  • Modbus tcp 批量写线圈状态