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

不同的子序列


Solution

有点像背包dp

cpp 复制代码
#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;
}
相关推荐
CoovallyAIHub8 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub10 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub10 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞10 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想
徐小夕12 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
CoovallyAIHub12 小时前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub13 小时前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉
zone773913 小时前
002:RAG 入门-LangChain 读取文本
后端·算法·面试