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

不同的子序列-二维动态规划

不同的子序列


Solution

有点像背包dp

#include<iostream>
#include<vector>
#include<string>
using namespace std;//递归做法
//f(i,j)表示从从字符串s的i开始到结尾,能够选出从字符串t从j到结尾的方案数
//相当于一个背包问题,s是n1件物品,每件物品选择拿和不拿,相等才可以拿,一直到把t所需要的都拿到手才表示一种方案结束
int f1(string s, string t, int i, int j) {int n1 = s.length();int n2 = t.length();if (j == n2) return 1;if (i == n1) return 0;int ans = f1(s, t, i + 1, j);if (s[i] == t[j]) ans += f1(s, t, i + 1, j + 1);return ans;
}//带缓存表的递归
int f2(string s, string t, int i, int j, vector<vector<int>>& dp) {int n1 = s.length();int n2 = t.length();if (j == n2) return 1;if (i == n1) return 0;if (dp[i][j] != -1) return dp[i][j];int ans = f2(s, t, i + 1, j, dp);if (s[i] == t[j]) ans += f2(s, t, i + 1, j + 1, dp);dp[i][j] = ans;return ans;
}//dp做法
unsigned long long f3(string s, string t) {int n1 = s.length();int n2 = t.length();vector<vector<unsigned long long>>dp(n1 + 1, vector<unsigned long long>(n2 + 1, 0));for (int i = n1; i >= 0; --i) {for (int j = 0; j <= n2; ++j) {//注意边界情况,递归的时候怎么写的,dp就怎么写if (j == n2) { dp[i][j] = 1; continue; }if (i == n1) { dp[i][j] = 0; continue; }unsigned long long ans = dp[i + 1][j];if (s[i] == t[j])ans += dp[i + 1][j + 1];dp[i][j] = ans;}}return dp[0][0];
}//dp+空间压缩
unsigned long long f4(string s, string t) {int n1 = s.length();int n2 = t.length();vector<unsigned long long>dp(n2 + 1,0);for (int i = n1; i >= 0; --i) {for (int j = 0; j <= n2; ++j) {if (j == n2) { dp[j] = 1; continue; }if (i == n1) { dp[j] = 0; continue; }unsigned long long ans = dp[j];if (s[i] == t[j]) ans += dp[j + 1];dp[j] = ans;}}return dp[0];
}
int numDistinct1(string s, string t) {return f1(s, t, 0, 0);
}int numDistinct2(string s, string t) {int n1 = s.length();int n2 = t.length();vector<vector<int>>dp(n1 + 1, vector<int>(n2 + 1, -1));return f2(s, t, 0, 0, dp);
}int numDistinct3(string s, string t) {return f3(s, t);
}int numDistinct(string s, string t) {return f4(s, t);
}
int main() {return 0;
}

http://www.dtcms.com/a/321819.html

相关文章:

  • GeeLark 7月功能更新回顾
  • 【补题】Codeforces Round 776 (Div. 3) E. Rescheduling the Exam
  • 三方相机问题分析七:【datespace导致GPU异常】三方黑块和花图问题
  • 显示器同步技术终极之战:G-Sync VS. FreeSync
  • xml 格式化
  • 卷板矫平机:把“翘脾气”的金属板材变平整
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘huggingface_hub’问题
  • C# 装箱拆箱
  • 数据结构进阶 详谈红黑树
  • Redis(⑤-线程池隔离)
  • javaSE(基础):5.抽象类和接口
  • C+++——内存管理
  • 大语言模型提示工程与应用:提示工程入门指南
  • 前端后端之争?JavaScript和Java的特性与应用场景解析
  • 大型语言模型幻觉检测与缓解技术研究综述
  • 将Django项目部署到Vercel平台的完整指南
  • Spring Boot 常用注解及其功能详解
  • Numpy科学计算与数据分析:Numpy高效数据处理与优化
  • 第七章:数据持久化 —— `chrome.storage` 的记忆魔法
  • bytearray和bytes
  • 解决flex元素内部文本溢出的问题min-width: 0
  • Pytest项目_day08(setup、teardown前置后置操作)
  • 树和二叉树和算法复杂度
  • 这款MEMS组合导航系统如何实现高性价比?
  • SVM实战:从线性可分到高维映射再到实战演练
  • 智能对讲机是什么?原理、优势、应用场景、发展趋势详解
  • 前端老项目依赖安全漏洞解决
  • 【LLM实战|langchain、qwen_agent】RAG高级
  • 888. 公平的糖果交换
  • YOLO-Count:用于文本到图像生成的可微分目标计数