动态规划——最长公共子序列问题

详解最长公共子序列问题(三种方法) C++分别利用三种动态规划解决最长公共子序列问题 阅读详情

动态规划算法与分治算法类似,基本思想都是将待解问题分解成若干个子问题,先求解子问题,然后根据子问题的解得到原问题的解。

在用分治法求解的时候有些子问题被重复计算了很多次。

动态规划算法则有效的将子问题的解保存起来,在需要的时候再找出来使用,这样就避免了大量的重复计算。

为了达到这样的目的,可以用一个表来记录所有已经解决的子问题的答案。


最长公共子序列问题:

一个给定序列的子序列是在该序列中删除若干元素之后得到的自序列。确切的说

若给定序列 ABCDEFG  , 则 ABC , CDE, ABCDEFG 等都是其自序列,不一定需要连续的

最长公共子序列也就是给定两个序列 X , Y,求这两个最长的相同的子序列。


最长公共子序列的结构有如下表示:
一:最长公共子序列的结构  
设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,则:
1> 若 xm=yn,则 zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列; 
2> 若 xm≠yn且 zk≠xm ,则 Z是 Xm-1和 Y的最长公共子序列;
3> 若 xm≠yn且 zk≠yn ,则 Z是 X和 Yn-1的最长公共子序列;
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1>。

二: 子问题的递归结构

由最长公共子序列问题的最优子结构性质可知,要找出X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。

    由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。

    与矩阵连乘积最优计算次序问题类似,我们来建立子问题的最优值的递归关系。用c[i,j]记录序列Xi和Yj的最长公共子序列的长度。其中Xi=<x1, x2, …, xi>,Yj=<y1, y2, …, yj>。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故c[i,j]=0。其他情况下,由定理可建立递归关系如下:


三: 计算最优值

直接利用上节节末的递归式,我们将很容易就能写出一个计算c[i,j]的递归算法,但其计算时间是随输入长度指数增长的。由于在所考虑的子问题空间中,总共只有θ(m*n)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。

    计算最长公共子序列长度的动态规划算法LCSLength(xlen,ylen,x,y,c,b);以序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储Xi与Yj的最长公共子序列的长度,bi,j]记录指示c[i,j]的值是由哪一个子问题的解达[到的,这在构造最长公共子序列时要用到。最后,X和Y的最长公共子序列的长度记录于c[m,n]中。

void LCSLength(int xlen, int ylen, char x[] , char y[], int c[][MAXLEN] , int b[][MAXLEN]) {
	int i , j;
	/*
	 c[i][j]代表当前X1X2...Xi和Y1Y2...Yj序列的公共子序列的长度
	 因为c[i][0]和c[0][j]都代表其中一个序列长度为0,所以公共自序列长度为0
	*/	
	for(i=0 ; i<xlen ; i++) {
		c[i][0] = 0;
	}
	for(j=0 ; j<ylen ; j++) {
		c[0][j] = 0;
	}
	// 根据不同的情况计算c[i][j]的值
	for(i=1 ; i<=xlen ; i++) {
		for(j=1 ; j<=ylen;j++) {
			if(x[i-1] == y[j-1]) {
				c[i][j] = c[i-1][j-1] + 1;
				b[i][j] = 1;
			} else if(c[i-1][j] > c[i][j-1]) { // 在c中也即为上侧
				c[i][j] = c[i-1][j];
				b[i][j] = 2; 
			} else { // 在c中也即为左侧
				c[i][j] = c[i][j-1];
				b[i][j] = 3;
			}	
		}
	}
}

由算法LCSLength计算得到的数组b可用于快速构造序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列。首先从b[m,n]开始,沿着其中的箭头所指的方向在数组b中搜索。

  • 当b[i,j]中遇到"↖"时(意味着xi=yi是LCS的一个元素),表示Xi与Yj的最长公共子序列是由Xi-1与Yj-1的最长公共子序列在尾部加上xi得到的子序列;
  • 当b[i,j]中遇到"↑"时,表示Xi与Yj的最长公共子序列和Xi-1与Yj的最长公共子序列相同;
  • 当b[i,j]中遇到"←"时,表示Xi与Yj的最长公共子序列和Xi与Yj-1的最长公共子序列相同。

    这种方法是按照反序来找LCS的每一个元素的。由于每个数组单元的计算耗费Ο(1)时间,算法LCSLength耗时Ο(mn)。

四:构造最长公共子序列

 下面的算法GetLCS实现根据b的内容打印出Xi与Yj的最长公共子序列。通过算法的调用LCS(b,X,length[X],length[Y]),便可打印出序列X和Y的最长公共子序列。

void GetLCS(int xlen, int ylen, char x[],int b[][MAXLEN]) {
	// 因为b[i][j]记录了c[i][j]是从那一种子问题的解得到的
	if(xlen == 0 || ylen == 0) {
		return ;
	}

	if(b[xlen][ylen] == 1) {
		GetLCS(xlen-1,ylen-1,x,b);
		printf("%c",x[xlen-1]);
	} else if(b[xlen][ylen] == 2) {
		GetLCS(xlen-1,ylen,x,b);
	} else {
		GetLCS(xlen,ylen-1,x,b);
	}
}
在算法LCS中,每一次的递归调用使i或j减1,因此算法的计算时间为 O (m+n)。
例如,设所给的两个序列为X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>。由算法LCS_LENGTH和LCS计算出的结果如下图所示:

                           

我来说明下此图(参考算法导论)。在序列X={A,B,C,B,D,A,B}和 Y={B,D,C,A,B,A}上,由LCSLength计算出的表c和b。第i行和第j列中的方块包含了c[i,j]的值以及指向b[i,j]的箭头。在c[7,6]的项4,表的右下角为X和Y的一个LCS<B,C,B,A>的长度。对于i,j>0,项c[i,j]仅依赖于是否有xi=yi,及项c[i-1,j]和c[i,j-1]的值,这几个项都在c[i,j]之前计算。为了重构一个LCS的元素,从右下角开始跟踪b[i,j]的箭头即可,这条路径标示为阴影,这条路径上的每一个“↖”对应于一个使xi=yi为一个LCS的成员的项(高亮标示)。

    所以根据上述图所示的结果,程序将最终输出:“B C B A”。


全部代码如下:

#include<stdio.h>
#include<string.h>

#define MAXLEN 30

void LCSLength(int xlen, int ylen, char x[] , char y[], int c[][MAXLEN] , int b[][MAXLEN]) {
	int i , j;
	/*
	 c[i][j]代表当前X1X2...Xi和Y1Y2...Yj序列的公共子序列的长度
	 因为c[i][0]和c[0][j]都代表其中一个序列长度为0,所以公共自序列长度为0
	*/	
	for(i=0 ; i<xlen ; i++) {
		c[i][0] = 0;
	}
	for(j=0 ; j<ylen ; j++) {
		c[0][j] = 0;
	}
	// 根据不同的情况计算c[i][j]的值
	for(i=1 ; i<=xlen ; i++) {
		for(j=1 ; j<=ylen;j++) {
			if(x[i-1] == y[j-1]) {
				c[i][j] = c[i-1][j-1] + 1;
				b[i][j] = 1;
			} else if(c[i-1][j] > c[i][j-1]) { // 在c中也即为上侧
				c[i][j] = c[i-1][j];
				b[i][j] = 2; 
			} else { // 在c中也即为左侧
				c[i][j] = c[i][j-1];
				b[i][j] = 3;
			}	
		}
	}
}

void GetLCS(int xlen, int ylen, char x[],int b[][MAXLEN]) {
	// 因为b[i][j]记录了c[i][j]是从那一种子问题的解得到的
	if(xlen == 0 || ylen == 0) {
		return ;
	}

	if(b[xlen][ylen] == 1) {
		GetLCS(xlen-1,ylen-1,x,b);
		printf("%c",x[xlen-1]);
	} else if(b[xlen][ylen] == 2) {
		GetLCS(xlen-1,ylen,x,b);
	} else {
		GetLCS(xlen,ylen-1,x,b);
	}
}

int main() {
	int i , j;
	char x[MAXLEN] , y[MAXLEN];
	int c[MAXLEN][MAXLEN] , b[MAXLEN][MAXLEN];
	// m记录X序列的长度,n记录Y序列的长度
	int xlen , ylen;
	// 分别输入X,Y序列
	printf("请输入X序列:\n");
	scanf("%s",x);
	xlen = strlen(x);
	printf("请输入y序列:\n");
	scanf("%s",y);
	ylen = strlen(y);
	LCSLength(xlen,ylen,x,y,c,b);
	printf("数组c的结果为:\n");
	for(i=1;i<=xlen;i++) {
		for(j=1;j<=ylen;j++) {
			printf("%3d",c[i][j]);
		}
		printf("\n");
	}
	printf("数组b的结果为:\n");
	for(i=1;i<=xlen;i++) {
		for(j=1;j<=ylen;j++) {
			printf("%3d",b[i][j]);
		}
		printf("\n");
	}
	printf("公共子序列长度为:%d\n", c[xlen][ylen]);
	printf("公共子序列为:");
	GetLCS(xlen,ylen,x,b);
	printf("\n");
 	return 0;
}

以上原理述说和图片参考自: http://blog.youkuaiyun.com/v_july_v/article/details/6695482





动态规划---例题2.最长公共子序列问题 本题与力扣主站1143题相同. 一.问题描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。 确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有 例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2, 3, 5, 7>。 阅读详情

相关推荐

动态规划—最长公共子序列问题

一、动态规划 动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法。 基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被

Tham 在思索中前行! 2179

算法笔记 //12_最长公共子序列问题(动态规划算法)

一、问题描述: 最长公共子序列问题: 给定两个序列 X = {x1, x2,x3,....,xm} 和 Y = {y1,y2,y3,....,yn} ,找出 X 和 Y 的最长公共子序列。 二、动态规划算法思想: 求解LCS问题,不能使用暴力搜索方法。一个长度为n的序列拥有 2的n次方个子序列,它的时间复杂度是指数阶,太恐怖了。解决LCS问题,需要借助动态规划的思想。 动态规划算法

VI___ 972

最长公共子序列问题动态规划

最长公共子序列问题: 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和

qq_46511838的博客 4975

最长公共子序列-动态规划算法

#include<iostream> #include<string> #include<iomanip> using namespace std; const int sz1 = 20; const int sz2 = 50; void LCSLength(int m,int n,char*x,char *y,int c[sz2][sz2],int b[sz2...

qq_44332021的博客 2389

动态规划 之 最长公共子序列问题

下面这篇文章介绍一下在算法设计中动态规划的最长公共子序列的问题。 最长公共子序列问题所谓,也即是分别给出长度为n和m的字符串A,B,然后找出其中最长公共子序列的最优值和最优解。 所谓最优值,也就是求出这个最长公共子序列的长度;而最优解,就是要求出这个最长最长公共子序列是什么的问题。给个不太恰当的例子:我们中学数学中经常会遇到求函数最值的问题,比如说求出函数 f(x) 的最大值,那么这个最大值就

小邓笔记 6514

算法复习——动态规划篇之最长公共子序列问题

算法复习——动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符)去掉后所得结果 公共子序列: 给定两个序列XXX和YYY 公共子序列示例 ​ 问题是如何求两个给定序列的最长公共子序列? 2. 问题定义 最长公共子序列问题(Longest Common Subsequence Problem) 输入: 序列X=<x1,x2,…,xn>X=<x_

NickHan_cs的博客 1327

剑指offer-例题 栈的压入、弹出序列

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) import java.util.ArrayList; import java.util.Stack; public class Solution { public boolean I

qq_39622795的博客 904

路由工具之策略路由policy-based-routing、MQC三板斧流分类、流行为、流策略

PBR(Policy-Based Routing,策略路由)策略路由可理解为控制路由,因为PBR策略的优先级高于传统路由表的转发,所以它主要用于影响数据包转发的技术。

Hades_Ling的优快云博客 5579

动态规划算法之最长公共子序列问题

本文转载自https://www.cnblogs.com/Jason-Damon/p/3245443.html 一、问题 某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置而形成的新序列。比如,BCAB是序列ABCBDAB的一个子序列。而最长公共子序列问题是寻找两个或多个已知序列它们最长的子序列。比如我们要寻找序列ACBDAW和序列DBAW的最长公共子序列,应该是BAW,长...

qq_32919451的博客 899

Quartz定时任务调度框架中的Misfire策略实战解析

本文深入解析了Quartz定时任务调度框架中的Misfire(失火)处理策略。针对SimpleTrigger和CronTrigger两种常用触发器,详细对比了其各自的Misfire指令(如NowWithExistingCount、FireAndProceed等)的核心行为与适用场景,并提供了基于不同业务需求(如数据补跑、时间点敏感度)的实战选型指南,帮助开发者构建更健壮可靠的任务调度系统。

weixin_29250573的博客 75

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 308

动态规划解最长公共子序列问题

动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。 为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字符子序列 问

yysdsyl的专栏 18万+

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

weixin_45735391的博客 12万+

动态规划-----最长公共子序列(及其衍生问题)

目录一.最长公共子序列的基本概念:解决动态规划问题的一般思路(三大步骤):二.最长公共子序列题目:三.字符串的删除操作:四.最小 ASCII 删除和:首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:最长公共子序列,顾名思

2302_79862386的博客 4709

基于计算机视觉的无人便利店技术:从算法到部署的系统化实战指南

摘要:本文系统介绍了基于计算机视觉的无人便利店技术方案,提出"商品检测-跟踪-动作识别-防损-结算"五段式流水线架构。详细阐述了YOLOv8-Seg商品检测、OC-Sort多目标跟踪、3D-CNN+ST-GCN动作识别等核心算法实现,并完成NVIDIA Jetson Xavier NX边缘端的优化部署。通过TensorRT量化、DeepStream加速等技术手段,系统在保持94.7%动作识别准确率的同时,将漏单率降至0.8%,单店云端算力成本较行业平均降低84%。所有代码已开源,可直接应

博客 624

LVGL在单色屏上运行

本文主要讲述LVGL在单色屏应用中的实现思路,并已验证通过。网上关于lvgl移植的文章有很多了,本文不加以赘述。

weixin_43278295的博客 4462

动态规划之最长公共子序列问题

问题描述 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是...

practical_sharp的博客 8619

【AutoSAR】【以太网】TCP/IP 栈详述与配置

目录 一、TCP/IP栈架构 二、TCP\IP栈的可扩展性 三、以太网协议V4 四、以太网协议 V6 五、基于IP的协议 六、函数调用序列图 一、TCP/IP栈架构 根据以上架构图,该栈主要包括:UPD\TCP\DHCP\ICMP\IPV4\IPV6\ARP; 二、TCP\IP栈的可扩展性 TCP\IP栈为适应不同的应用场景需求,将分为三类: 配置工程里的配置项: 三、以太网协议V4 1 IPV4 Internet Protocol (IP)是T.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 5695

动态规划经典算法之最长公共子序列问题

开篇 最长公共子序列问题又称为LCS问题,这个问题和动态规划的很多问题无论从思路还是框架上都非常相似,比如编辑距离问题(后续的文章中会讲到),所以掌握这个最经典的LCS问题是很有必要的。话不多说我们开始吧。 题目描述 题目就是让我们求两个字符串的最长公共序列,字符的相对顺序不能变,求出最长序列长度。 输入:str1 = "abdefc",str2 = "aecf" 输出:长度为3 解释:最长公共子...

weixin_44755413的博客 3718

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 617

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

动态规划详解:最长公共子序列问题的高效解法

我们可以定义一个二维数组dp,其中dp[i][j]表示text1[0:i]和text2[0:j]的最长公共子序列的长度。动态规划是解决最长公共子序列问题的最优解法,时间复杂度为O(m * n),空间复杂度也是O(m * n)。通过二维数组存储子问题的解,可以避免大量的重复计算。**递归法(带备忘录)**也是一种可行的方案,它通过递归来逐步求解子问题,使用备忘录存储中间结果,从而避免重复计算,时间复杂度同样为O(m * n)。

qq_22841387的博客 7475

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

算法知识之最长公共子序列问题(动态规划)

最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij.公共子序列:给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列.最长公共子序列:给定2个序

测试0901-1 7473

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【算法设计与分析】最长公共子序列问题 动态规划算法 超详细

最长公共子序列问题描述 运行效果 调试中的一个过程截取 单步填写之后 …其余中间过程省略 最终执行结果↓ 输出:BDFI 代码 #include<iostream> #include<cstring> using namespace std; int c[10][7];//Xi Yj的最长公共子序列的长度 int s[10][7];//c[i][j]的值是由...

寒泉 3万+

基于动态规划方法求解最长公共子序列问题

在找 A 和 B 的公共子序列时,如有 am-1=bn-1,则进一步解决一个子问题,找“a0, a1,…=bn-1,则 要解决两个子问题,找出“a0,a1,…,bn-1”的一个最长公共 子序列和找出“a0,a1,…,xm-1”,序列 Y=“y0,y1,…,yk-1”是X的子序列,存在 X 的一个严格递增下标序列,使得对所有的 j=0,1,…,am-1”,B=“b0, b1,…,bm-1”,并 Z=“z0,z1,…(1) 如果 am-1=bn-1,则 zk-1=am-1=bn-1,且“z0,z1,…

m0_61679138的博客 781

详解最长公共子序列问题,秒杀三道动态规划题目

学算法认准labuladong后台回复进群一起力扣????读完本文,可以去力扣解决如下题目:1143.最长公共子序列(Medium)583. 两个字符串的删除操作(Medium)712...

fdl123456的博客 2778
上一篇: 动态规划——矩阵连乘的问题
下一篇: 动态规划——最大子段和问题
java_wliang
博客等级 码龄15年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值