代码随想录Day24 | 回溯

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署 本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。 阅读详情

回溯理论

文档讲解:代码随想录
视频讲解: 带你学透回溯算法(理论篇)
状态

回溯就是在递归中回溯。所以回溯函数就是递归函数。
我们在二叉树递归中用到回溯就可以发现使用了回溯的方法,都是需要遍历整个二叉树的。所以使用回溯通常就是暴力搜索解决问题

一般解决问题

  1. 组合问题:N个数里面按一定规则找出k个数的集合
  2. 切割问题:一个字符串按一定规则有几种切割方式
  3. 子集问题:一个N个数的集合里有多少符合条件的子集
  4. 排列问题: N个数一定规则全排列,有几种排列方式
  5. 棋盘问题: N皇后、解数独
    关于组合和排列: 组合是集合中的元素不强调元素顺序,排列是强调元素顺序

回溯抽象

一个回溯问题可以抽象为一棵树,这是由于回溯问题就是在集合中递归查找满足条件的子集,一个集合的大小就构成了树的高度,递归查找的次数可以看作树的深度。

回溯模板

  1. 返回值和参数
//一般返回值为void
//参数的确定是需要根据实际逻辑来写的
  1. 终止条件
    可以参考我们遍历树的每条路径的道理,回溯的终止条件就是当现在这个结果满足条件时,存放结果然后返回
if(满足条件)
{
	存放
	return ;
}
  1. 遍历过程
    在这里插入图片描述
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
    处理节点;
    backtracking(路径,选择列表); // 递归
    回溯,撤销处理结果
}

这是由于回溯对比二叉树来说,它其实是一个N叉树,所以需要对一层中每个节点进行扫描(for循环),然后再纵向遍历(递归)

77.组合

文档讲解:代码随想录
视频讲解: 带你学透回溯算法-组合问题(对应力扣题目:77.组合)
状态

注意本题是组合,所以是无序的。
从n个数里面取k个,我们将其对应到上方那个n叉树中,第一层根节点整个集合,第二层就是集合取1个数之后的剩余子集和,并且相对左子树取过的数在第二层集合也不需要出现(避免重复,如果是排列就需要出现了),那么第三层就是每个父节点再取1个数,直到取满k个数。
在这里插入图片描述
那么终止条件就是当存储数组的长度达到k时,返回并且存储结果。
单层回溯的逻辑就是,对该层的父节点中的每个元素进行递归调用

class Solution {
private:
vector<int> path;
vector<vector<int>> res;

public:
    void backtracking(int n,int k, int targetIndex)
    {
        //终止条件 path的长度 == k
        if(path.size() == k)
        {
            res.push_back(path);
            return ;
        }
        //单层回溯逻辑
        //遍历一层
        for(int i=targetIndex;i<=n;i++)
        {
            //路径压入当前元素
            path.push_back(i);
            //为当前元素的子节点递归
            backtracking(n,k,i+1);
            //弹出压入的元素,回到父节点,开启下一个元素的搜索
            path.pop_back();
        }
        return ;
    }
public:
    vector<vector<int>> combine(int n, int k) {
        backtracking(n,k,1);
        return res;
    }
};

回溯的优化–剪枝

文档讲解:代码随想录
视频讲解: 带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!
状态

对于这道题目,显然当n-i+1<k-path.size()时就不需要进行递归了,因为之后剩余的元素肯定不存在元素个数=k的数组了。
即如果i>n-(k-path.size())+1之后就不可能在后续子树中找到由k个数组合的数组了

 //修改边界条件到达剪枝
        for(int i=targetIndex;i<=n+1-(k-path.size());i++)
        {
            //路径压入当前元素
            path.push_back(i);
            //为当前元素的子节点递归
            backtracking(n,k,i+1);
            //弹出压入的元素,回到父节点,开启下一个元素的搜索
            path.pop_back();
        }
drm 之modes #define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <time.h&... 阅读详情

相关推荐

从X86到ARM:全面解析服务器CPU架构的演变与未来趋势

本文深入解析了服务器CPU架构从X86到ARM的演变历程与未来趋势。文章从CISC与RISC两种设计哲学切入,分析了X86凭借生态建立的帝国地位及其面临的功耗挑战,并重点阐述了ARM架构凭借其卓越的能效比优势,正从移动端向数据中心市场发起冲击。未来,异构计算、软硬协同与专用芯片将成为服务器CPU发展的核心方向。

gold的博客 1127

代码随想录day24 回溯part3

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。

Hoshinoharuka的博客 299

深入解析:如何在Visual Studio中高效编译libredwg与libdxfrw

本文详细介绍了在Visual Studio中高效编译libredwg与libdxfrw的完整流程,包括环境配置、源码获取、CMake技巧及常见错误解决方案。针对CAD开发者,提供了从基础编译到项目集成的实用指南,帮助快速处理DWG/DXF文件,提升开发效率。

weixin_29215391的博客 232

代码随想录算法训练营Day24| 回溯算法part01

回溯算法

weixin_57654532的博客 146

分享一些基于微信小程序开发的小游戏源码

小游戏小程序是运行在微信生态系统(或其他支持小程序的平台)中的轻量级应用程序,专为休闲游戏体验而设计的小程序子类别,小游戏小程序通常体积较小,加载速度快,用户无需等待长时间即可开始游戏。用户无需下载或安装单独的游戏应用程序,即可通过小程序入口直接进入游戏,同时小游戏小程序通常包含排行榜、分享功能等社交元素,可以增强游戏体验并促进用户参与。game.js:游戏页面的逻辑文件,包含页面数据、生命周期函数、事件处理函数等。game.wxml:游戏页面的结构文件,定义了页面的布局和组件。

xinshangdian的博客 6226

【从零开始学产品经理】项目立项实战(1)——基本方案与可行性分析:基于微信小程序的记账本

主要阶段:立项-设计-开发-测试-上线-运营-总结。

Ckiyvo的博客 3211

【代码随想录训练营day24】回溯法part03

继续加油。

herogift的博客 219

某音私信接口二进制解析

本文探讨了某音私信接口的二进制请求处理过程,重点分析了请求体中的非文本字符和混合编码结构。文章详细描述了编码过程,包括使用Protocol Buffers的序列化方法将结构化数据转换为字节流,并通过Uint8Array包装成二进制数组。作者展示了如何提取和补全s.encode方法,并将其转化为Base64字符串以便在Python中解码执行

码王吴彦祖的博客 901

代码随想录 day 24 回溯

要排序(把相邻的元素放在一起),相同元素跳过,(否则注定会和前面的元素取出重复的子集(组合)1 1 2 第一个1取的元素已经包含第二个1取的所有元素还包含了第二个1 所以要跳过 以达到去重 “数层去重”) startIndex=i+1。大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。不重复,startIndex=i+1 取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始。

weixin_45549711的博客 465

btstack ble ota开发笔记(2)-mcuboot移植

紧接上一篇文章,要实现一个完整的ota demo,除了实现ota image的传输通道外,还需要“bootloader”这个角色来帮我们实现ota image的校验、安全、引导以及启动,这里我选择开源的组件mcuboot,下面开始介绍mcuboot在stm32f4-discovery上的移植。首先估算下bootloader & application image的大小,确定好flash的分布情况,因为后续会涉及到flash的操作(读、写、擦除),为了方便程序的编写,各个image area在flash中的起

weixin_38177846的博客 2350

【AUTOSAR-DEM】-2.1-APP SWC设置UDS/OBD DTC检出和恢复

点击返回「《Autosar_BSW高阶配置》总目录」 案例背景(共6页精讲): DEM模块提供两种不同类型的Event: • BSW-related events:DEM_EVENT_KIND_BSW(通过C-API报告 - Dem_SetEventStatus) • SW-C-related events:DEM_EVENT_KIND_SWC(通过RTE operation - SetEventStatus) 下面我们讲讲在APP SWC中设置BusOff(总线关闭) DTC故障成立/恢复(其它

「汽车电子助手」的博客 3944

代码随想录【Day 24】 | 回溯算法、77. 组合

代码随想录【Day 24】 | 回溯算法、77. 组合

Pittsman的博客 246

AXI_Bus_Matrix_4x4 设计

Signal Source Width(bits) Description AWID Master AWID_WIDTH 写事务ID AWADDR Master

Starry__的博客 3768

代码随想录day 24 回溯

代码随想录day 24 回溯

shiliuhua05的博客 173

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

代码随想录Day 24 - 回溯

代码随想录Day 24 - 回溯

weixin_43823613的博客 391

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

二刷代码随想录——回溯day24

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!

qq_43264167的博客 468

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

代码随想录day24 开启回溯算法

感觉回溯算法其实和递归很像,也是用递归的做法,也有三部曲,但又不太一样的地方是递归中类似二叉树,只有纵向遍历(一层层往下遍历,没有横向遍历),而回溯算法中多的for循环就是横向遍历,说实话这一点我没有理解的太深,只是知道它类似于两个for循环中的第一个for循环,以后有更深的理解以后再来补全吧,先给出递归三部曲写法:1、确定函数名和参数 void backTracking(参数)2、确定终止条件,并在终止条件里存放结果和returnif(终止条件){存放结果;return;

2301_80817427的博客 578

代码随想录 day24 回溯算法

示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]给定两个整数 n 和 k,返回 1 …n 中所有可能的 k 个数的组合。回溯算法主要使用dfs。

dream__future的博客 442

【代码随想录Day24】回溯算法Part03

【代码】【代码随想录Day24】回溯算法Part03。

Shayne 的博客 527

代码随想录算法训练营DAY24|回溯1

组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。从而引出了回溯法就是解决这种k层for循环嵌套的问题。然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。本篇我们准对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。

XIAOHAIYOU的博客 943

代码随想录day24,回溯算法part3

在元素个数为1的子集上写出元素个数为2的子集[1]-->[1,2],[1,3],[2]-->[2,3]。[2]中如果添加1,那就会和之前的[1,2]重复。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]接下来是在空集基础上生成元素个数为 1 的所有子集[1],[2],[3]。输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]中拿 2 个元素形成所有的组合,就是所有大小为 2 的子集。接下来是元素个数为3的子集,[1,2]-->[1,2,3]。

weixin_56656029的博客 610

代码随想录day24--回溯的应用3

但是加入题解中的条件不一样,需要一个pointNum,记录添加逗号的数量,如果pointNum为3说明字符串分成了四段,再创造一个isVaild函数,验证一下每段字符串是否合法,即可将其加入到结果集中。·这题与之前的组合问题并不一样,如果把子集问题、组合问题、分割问题都抽象为一棵树,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!·将组合问题和分割问题,与子集问题概念混淆,组合问题和分割问题都素收集树的叶子节点,而子集问题是找到树的所有节点。LeetCode93.修复IP地址。

weixin_66278978的博客 1245

day24 代码随想录算法训练营 回溯专题3

复原IP地址(分割问题)、子集问题、子集问题去重

I_CLK的博客 1104

Day24 代码随想录(1刷) 回溯

给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],[[1]]状态:完成。

SuperSwaggy的博客 1063

【代码随想录训练营】Day24-回溯算法

代码随想录训练营第24天

weixin_38255385的博客 1520

代码随想录刷题day24|回溯理论基础&组合问题

基本概念:回溯法也称作回溯搜索法,是一种穷举搜索方式。在解决问题过程中,回溯法会试图分步去解决一个问题。每一步都基于当前的解尝试进一步的解决,如果发现当前的步骤不能得到有效的解或者达到了问题的边界,它将退回一步,尝试其他可能的路径。就是排除已经考虑过的元素先说结论:如果剩余可选的元素数量加上当前已选择的元素数量小于所需的元素数量 k,那么就没有必要继续搜索了,因为即使选择了所有剩余的元素,也无法满足组合中应有的元素数量。推论,为什么是这样?n是总的元素数量。k是需要选择的元素数量。

东东唯一指定铲屎官 1203
上一篇: 代码随想录Day23 | ● 669. 修剪二叉搜索树 ● 669. 修剪二叉搜索树 ● 669. 修剪二叉搜索树
下一篇: 代码随想录Day25 | 216.组合总和III 17.电话号码的字母组合
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值