算法设计与分析——动态规划——矩阵连乘问题

算法分析与设计---分治+动态规划 算法分析与设计,期末,动态规划 阅读详情

动态规划与分治法的异同:

相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。

差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是相互独立的。有些问题分解后的子问题往往是重复的,此时若用分支法则会重复计算耗费时间内存。

总结:为了达到避免重复计算,可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。

步骤:

找出最优解的性质,刻画其结构特征。
递归地定义最优值。
以自底向上的方式计算最优值。
根据计算最优值得到的信息构造最优解。
矩阵连乘问题
分析最优解的结构
建立递归关系
计算最优值
构造最优解
动态规划算法的基本要素

最优子结构:当问题的最优解包含了其子问 题的最优解时,称该问题具有最优子结构性质。

重叠子问题:在用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算。动态规划算法对每个子问题只解一次,然后将解保存在一个表格中。

问题描述:

给定n个矩阵:A1,A2,…,An,其中Ai与Ai+1是可乘的,i=1,2…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。

问题解析:

由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。

例如,矩阵连乘积A1A2A3A4有5种不同的完全加括号的方式:(A1(A2(A3A4))),(A1((A2A3)A4)),((A1A2)(A3A4)),((A1(A2A3))A4),(((A1A2)A3)A4)。每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。

有点需要记住,两个矩阵相乘之后得到的矩阵的行为前面一个矩阵的行,列为后面一个矩阵的列,复杂度与第一个矩阵的列也有关。

递推规律:

设计算A[i:j](矩阵A从i乘到j),1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n](上面例题就是m[1][6])。

当i=j时,A[i:j]=Ai,因此,m[i][i]=0,i=1,2,…,n
当i<j时,若A[i:j]的最优次序在Ak和Ak+1之间断开,i<=k<j,则:m[i][j]=m[i][k]+m[k+1[j]+pi-1pkpj。由于在计算是并不知道断开点k的位置,所以k还未定。不过k的位置只有j-i可能。因此,k是这j-i个位置使计算量达到最小的那个位置。

综上,有递推关系如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
 
#define N 7  //N为7,实际表示有6个矩阵//也就是p数组的元素个数 

/*
*矩阵链构造函数:构造m[][]和s[][]
*m中存储的值是计算出来的最小乘法次数,比如m[1][5]就是A1A2A3A4A5的最小乘法次数
*s中存储的是获取最小乘法次数时的断链点,s[1][5]对应的就是如何拆分A1A2A3A4A5,
*比如S[1][5]=3可表示:(A1A2A3)(A4A5),当然内部断链还会继续划分A1A2A3
*/
int MatrixChain(int *p, int n, int m[][N], int s[][N]){
    for(int i=1;i<=n;i++){     //矩阵链中只有一个矩阵时,次数为0,注意m[0][X]时未使用的
        m[i][i]=0;
    }
    for(int r=2;r <= n;r++){    //矩阵链长度,从长度为2开始
        for(int i=1;i <= n-r+1;i++){    //根据链长度,控制链最大的可起始点
            int j = i+(r-1);  //矩阵链的末尾矩阵,注意r-1,因为矩阵链为2时,实际是往右+1
            m[i][j] = m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];   //先设置最好的划分方法就是直接右边开刀,后续改正,也可合并到下面的for循环中
            s[i][j]=i;
            for(int k=i+1;k < j;k++){   //这里面将断链点从i+1开始,可以断链的点直到j-1为止
                int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                if(t<m[i][j]){
                    m[i][j] = t;
                    s[i][j] = k;
                }
 
            }
 
        }
    }
}
/*
*追踪函数:根据输入的i,j限定需要获取的矩阵链的始末位置,s存储断链点
*/
void Traceback(int i,int j, int s[][N]){
    if(i==j)       //回归条件
    {
        cout<<"A"<<i;
    }
    else       //按照最佳断点一分为二,接着继续递归
    {
        cout<<"(";
        Traceback(i,s[i][j],s);
        Traceback(s[i][j]+1,j,s);
        cout<<")";
    }
}
void Traceback2(int i,int j,int s[][N])
{
	if(i==j)
	{
		return ;
	}
	else
	{
		Traceback(i,s[i][j],s);
		Traceback(s[i][j]+1,j,s);
		cout<<"Mutiply A"<<i<<", "<<s[i][j];
		cout<<" and A"<<(s[i][j]+1)<<","<<j<<endl;
	}
} 


int main(){
	int p[N]={30,35,15,5,10,20,25};
	int m[N][N],s[N][N];
 
	MatrixChain(p,N-1,m,s);//N-1因为只有六个矩阵
	Traceback(1,6,s);
	cout<<endl;
    Traceback2(1,6,s);
    
	return 0;
}
 
#include<bits/stdc++.h>
using namespace std;

#define N 7
int m[N][N];
int s[N][N];
int p[N]={30,35,15,5,10,20,25};
int RecurMatrixChain(int i,int j)
{
	if(i==j)
	{
		return 0;
	}
		int u=RecurMatrixChain(i,i)+RecurMatrixChain(i+1,j)+p[i-1]*p[i]*p[j];
		s[i][j]=i;
	for(int k=i+1;k<j;k++)
	{
		int temp=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j)+p[i-1]*p[k]*p[j];
		if(temp<u)
		{
			u=temp;
			s[i][j]=k;
		}
	}
	return u;	
}

void Traceback(int i,int j, int s[][N]){
    if(i==j)       //回归条件
    {
        cout<<"A"<<i;
    }
    else       //按照最佳断点一分为二,接着继续递归
    {
        cout<<"(";
        Traceback(i,s[i][j],s);
        Traceback(s[i][j]+1,j,s);
        cout<<")";
    }
}
int main(){
	RecurMatrixChain(1,N-1);//N-1因为只有六个矩阵
    Traceback(1,6,s);
	return 0;
}

在这里插入图片描述

#include<iostream>
using namespace std;
 
#define N 7  //N为7,实际表示有6个矩阵
int p[N]={30,35,15,5,10,20,25};
int m[N][N],s[N][N];

int LookupChain(int i, int j){
    if(m[i][j]>0)
        return m[i][j];
    if(i == j)
        return 0;
    m[i][j] = LookupChain(i,i) + LookupChain(i+1,j)+p[i-1]*p[i]*p[j];
    s[i][j] = i;
    for(int k=i+1; k<j;k++){
        int t = LookupChain(i,k)+LookupChain(k+1,j)+p[i-1]*p[k]*p[j];
        if(t<m[i][j]){
            m[i][j]=t;
            s[i][j]=k;
        }
    }
    return m[i][j];
}
 
int MemorizedMatrixChain(int n, int m[][N], int s[][N]){
    for(int i=1;i<=n;i++){  //初始化默认都是0
        for(int j=1;j<=n;j++)
            m[i][j] = 0;
    }
    return LookupChain(1,n);
}
/*
*追踪函数:根据输入的i,j限定需要获取的矩阵链的始末位置,s存储断链点
*/
void Traceback(int i,int j, int s[][N]){
    if(i==j)       //回归条件
    {
        cout<<"A"<<i;
    }
    else       //按照最佳断点一分为二,接着继续递归
    {
        cout<<"(";
        Traceback(i,s[i][j],s);
        Traceback(s[i][j]+1,j,s);
        cout<<")";
    }
}
int main(){
 
 
	MemorizedMatrixChain(N-1,m,s);//N-1因为只有六个矩阵
    Traceback(1,6,s);
	return 0;
}
 
动态规划之矩阵连乘问题详细解读(思路解读+填表+代码) 动态规划简介 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填 阅读详情

相关推荐

动态规划——矩阵连乘问题

动态规划简介 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结

金州饿霸吃不饱的博客 1246

湖南大学算法分析与设计期末总复习上(分治、动态规划,贪心部分)

算法分析与设计期末总复习上(分治、动态规划,贪心部分) by--iamnii 这个是我期末考试自己做的总结,把书的重点内容基本梳理了一遍,但是有些上课没有讲的算法就没有归纳,大家可以结合自己老师讲的内容再深入复习。 另外,HNU算法考试基本都是算法思想、代码、应用、时间复杂度几个部分,所以总结的时候也是集中关注这几部分,希望对大家有帮助~ PS:有“应用”的部分一定要会画图或者打表,期中考试考过的我就暂时没有贴代码啥的,有时间再补充吧 分治法 1、基本思想: 将规模为n的问题分为k个规模较

nikolalala的博客 2149

STM32_USB复合设备开发实战:基于CubeMX插件简化HID与CDC集成

本文详细介绍了如何使用STM32CubeMX插件简化USB复合设备开发,特别是HID与CDC的集成。通过自动处理多设备描述符融合和端点资源分配,该插件显著降低了开发复杂度,帮助工程师快速实现键盘、鼠标和虚拟串口等复合功能,提升STM32 USB开发效率。

palm99的专栏 748

【算法设计与分析】 矩阵连乘(动态规划)

【算法设计与分析】 矩阵连乘(动态规划) 【问题描述】 使用动态规划算法解矩阵连乘问题,具体来说就是,依据其递归式自底向上的方式进行计算,在计算过程中,保存已子问题答案,每个子问题只解决一次,在后面计算需要时只要简单查一下得到其结果,从而避免大量的重复计算,最终得到多项式时间的算法。 【输入形式】 在屏幕上输入第1个矩阵的行数和第1个矩阵到第n个矩阵的列数,各数间都以一个空格分隔。 【输出形式】 矩阵连乘A1…An的最少数乘次数和最优计算次序。 【样例输入】 30 35 15 5 10 20 25 【样例

weixin_46283740的博客 2302

四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当初的学习记录。

weixin_51651698的博客 6万+

vue中使用video-player视频插件,第一次无法监听父组件穿过来的值解决办法

需求: 页面![在这里插入图片描述](https://img-blog.csdnimg.cn/20201208141906802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FfOTg4OA==,size_16,color_FFFFFF,t_70) 作品清单是从后端请求回来的不同格式的url,前端需求根据后缀动态判断格式,然后对齐进行下载和

A_9888的博客 768

算法分析与设计:矩阵连乘问题(动态规划)

问题描述 给定nnn个矩阵A1,A2,……,An{A1,A2,……,An}A1,A2,……,An,其中AiA_iAi​与Ai+1A_{i+1}Ai+1​是可乘的,i=1,2,……,n−1i=1,2,……,n-1i=1,2,……,n−1。 例如: 计算三个矩阵连乘A1,A2,A3{A_1,A_2,A_3}A1​,A2​,A3​;维数分别为10×10010 \times 10010×100 , 100×5100\times5100×5 , 5×505\times505×50 按此顺序计算需要的次数((A1∗A2

SongXJ的博客 2981

Cadence电路原理图全部变成黄色如何解决?

Cadence电路原理图全部变成黄色如何解决?现象:解决方法: 最近用cadence仿真锁相环,拷贝师哥的library后打开,发现schematic中全部变成了黄色,但可以正常修改元件参数,正常仿真。仅仅影响使用效果,看起来超级难受。 现象: 1.电路元件及连线全部变为黄色 2.可以正常修改参数,电路ADE仿真 如下图所示: 解决方法: 重新导入display.drf文件,步骤如下: tool——Display Resource Manager,截图如下 完成上述步骤,显示如下界面,选择Merge选项

virtuoso~晓晓 1万+

算法分析与设计(五、动态规划法-矩阵连乘问题)

算法分析与设计(五、动态规划法-矩阵连乘问题)1、矩阵链乘问 1、矩阵链乘问       矩阵链乘问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 ...

rvp20的博客 1124

数电实训:万年历

万年历

Lmyccq的博客 1万+

Chronos时间序列预测实战:从零开始微调你的第一个大语言模型(附完整代码)

本文提供了一份详细的Chronos时间序列预测大语言模型微调实战指南。从环境搭建、数据预处理到模型配置与训练,手把手教你如何利用自己的数据微调Chronos模型,并完成评估与部署,助你快速掌握这一前沿技术。

zzz56的博客 300

【算法设计与分析】矩阵连乘问题(动态规划)

一、背景介绍 1.题目 给定n个矩阵{A1,A2,…,An} , 其中Ai与Ai+1 是可乘的i=1,2,…n-1, 考察这n个矩阵的连乘积 : A1A2…An 矩阵连乘具有许多计算顺序 原因:矩阵乘法满足结合律; 这种计算次序可以用加括号的方式来确定。 完全加括号 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号; 则可以依此次序反复调用2个矩阵...

○( ^皿^)っHiahiahia…的博客 1万+

解锁Gemini+Google Sheets/Excel:数据分析自动化新姿势

本文介绍了如何将谷歌AI工具Gemini集成到Google Sheets和Excel中进行智能数据分析。主要内容包括:1) Gemini的功能特点,具备语言理解和生成能力;2) 在Google Sheets中的集成步骤,包括订阅Workspace、开启Gemini功能及使用方法;3) 通过第三方插件在Excel中使用Gemini的方法;4) 销售和财务数据分析的实际案例;5) 使用时的注意事项,包括数据安全、问题处理和常见错误解决。通过Gemini集成,用户可以实现高效的数据处理和智能分析,提升工作效率。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 569

【算法设计与分析】动态规划算法(矩阵连乘问题、0-1背包问题、最长公共子序列问题、最优二叉检索树问题)

第二行 输入n + 1 个数,相邻两个数分别代表矩阵的行、列数。3)能够对实际问题,能够按照动态规划解题步骤,分析问题;5)能够正确分析算法的时间复杂度和空间复杂度。时间复杂度和空间复杂度均为 O(n * m)第一行 一个正整数 n 表示矩阵的个数。4)能够正确的编码、实现动态规划算法;2)掌握算法的基本要素及解题步骤;1)了解动态规划算法思想;最佳添加括号的方式为:(A。最小计算量的值为:150。

naogua_wyy的博客 1775

47_AI智能体核心业务之全局主控Agent:智能对话系统的统一指挥中心

本文介绍了全局主控Agent的架构设计与实现,该组件作为智能对话系统的统一指挥中心,提供标准化的多模式处理接口。系统支持普通对话、工具命令执行和流式响应三种处理模式,通过智能工作流路由协调多个处理引擎。统一的消息封装和异步架构设计确保了系统的高性能和可扩展性,已成功处理300万次用户请求,平均响应时间1.2秒。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 339

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

矩阵连乘问题算法思想_算法设计与分析——矩阵连乘问题(动态规划)

一、问题描述引出问题之前我们先来复习一下矩阵乘积的标准算法。int ra,ca;//矩阵A的行数和列数int rb,cb;//矩阵B的行数和列数voidmatrixMultiply(){for(int i=0;i{for(int j=0;j{int sun=0;for(int k=0;k<=ca;k++){sum+=a[i][k]*b[k][j];}c[i][j]=sum;}}}给定n个矩阵...

weixin_39875842的博客 1091

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)

一、问题描述引出问题之前我们先来复习一下矩阵乘积的标准算法。int ra,ca;//矩阵A的行数和列数int rb,cb;//矩阵B的行数和列数voidmatrixMultiply(){for(int i=0;i{for(int j=0;j{int sun=0;for(int k=0;k<=ca;k++){sum+=a[i][k]*b[k][j];}c[i][j]=sum;}}}给定n个矩阵...

weixin_30140707的博客 944

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

算法设计与分析 矩阵连乘问题 动态规划

举例 计算次序 按照矩阵链的长度递增(1,2, … n)顺序,计算m[i,j] 。 算法matrixChain,首先计算出m[i,i]=0,i=1,2,…,n。 然后,根据递归式,按矩阵链长递增的方式依次计算: m[i,i+1],i=1,2,…,n-1,(矩阵链长度为2); m[i,i+2],i=1,2,…,n-2, (矩阵链长度为3); … 在计算m[i,j]时,只用到已计算出的m[i,k]和...

寒泉 1万+

算法设计与分析:矩阵连乘问题(动态规划与备忘录算法对比)

问题描述 给定n个矩阵:A1,A2,…,An,其中Ai与Ai+1是可乘的,i=1,2…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 动态规划解题思路 矩阵链构造函数:构造m[][]和s[][] m中存储的值是计算出来的最小乘法次数,比如m[1][5]就是A1A2A3A4A5的最小乘法次数 s中存储的是获取最小乘法次数时的断链点,s[1][5]对应的就是如何拆分A1A2A3A4A5, 比如s[1][5]=3可表示:(A1A2A3)(A4A5),当然内部断链还会继续划分

qq_45038855的博客 1996

算法分析与设计——动态规划矩阵连乘问题C++

#include <iostream> using namespace std; #define N 7 int MatrixChain(int *p,int n,int m[][N],int s[][N]) { for(int i=1;i<=n;i++){ m[i][i]=0; } for(int r=2;r<=n;r++){ for(int i=1;i<=n-r+1;i++){ int j=i+r-1; m[i][j]=m[i][i]+m

晚安Alice 943

中科院陈玉福算法设计与分析 动态规划矩阵连乘计算问题

第一次:划分两个子矩阵。 A1A2 303515=15750 A2A3 35155=2625 A3A4 15510=750 A4A5 51020=1000 A5A6 102025=5000 第二次:划分三个子矩阵 A1A2A3: (A1(A2A3))=2625+30355=7875 ((A1A2)A3)=15750+30155=18000 故A1A2A3=(A1(A2A3))=7875 A2A3A4: (A2(A3A4))=750+351510=6000 ((A2A3)A4)=2625+35510=

UCAS小时的博客 463

矩阵连乘问题(动态规划)--算法设计与分析

//动态规划 public class matrixChain1 { //定义一个存储矩阵维度的数组 static int p[]= {1,2,3,4,5,6,}; static int n=p.length-1; static int [][]s=new int[n+1][n+1]; static int [][]m=new int [n+1][n+1]; public static void main(String[] args) { //matrix.

weixin_59337031的博客 837

算法设计与分析(python版)-作业四

1 .普通(5分)解决给定的5个矩阵连乘问题:矩阵A1(3×2)、A2(2×5)、A3(5×10)、A4(10×2)和A5(2×3),设m[i][j]表示Ai...Aj的最优计算次序对应的乘法计算次数(最优值),P为存储矩阵行列的数组,其中P[i]是第i个矩阵的列、第i-1个矩阵的行。求解最优值递归关系是为:,根据该递归关系式,求解过程中得到下面最优决策的二维表: 由此,可得上述5个矩阵连乘的最优计算次序为() A. (A1(A2(A3(A4A5))))B. ((A1A2)(A3(A4A5)))

qq_61727355的博客 2750

算法设计与分析 动态规划 3.1矩阵连乘问题(2022.03.18)

实现第五版,王晓东编著的第三章3.1矩阵连乘问题的代码。课本46页。 #include<iostream> using namespace std; void MatrixChain(int *p,int n,int **m,int **s); void Traceback(int i,int j,int **s); int main(){ int n; cout<<"请输入矩阵个数:"; scanf("%d",&n); int **m=new int *[n];/

idiot_csdn的博客 1004

算法分析与设计 第四次理论作业

TOC]

没事发发博客 627

实验二:矩阵连乘(动态规划)

1.实验题目 矩阵连乘问题 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 2.实验目的 1.掌握动态规划算法的基本思想、技巧和效率分析方法。  2.熟练掌握动态规划算法的最优子结构性质的分析与证明。  3.学会利用动态规划算法解决实际问题。 3.实验要求 (1)根据实验内容构思设计算法,选取适合的数据结构;  (2)对所设计的算法采用大O符号进行时间复杂性分析;  (3)上机实现算法,

qq_43727105的博客 1万+
上一篇: 算法设计与分析——递归与分治策略——最接近点对问题
下一篇: 算法设计与分析——动态规划——数字三角形问题
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值