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

项目招商手机系统优化软件

项目招商,手机系统优化软件,那种系统做网站比较好,微信网站怎么做的好1.判断子序列: 动态规划五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 注意这里是判断s是否…

1.判断子序列:

动态规划五部曲分析如下:

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]

注意这里是判断s是否为t的子序列。即t的长度是大于等于s的。

如果t的长度小于s那直接return false,如果s的长度为0,是return true;

有同学问了,为啥要表示下标i-1为结尾的字符串呢,为啥不表示下标i为结尾的字符串呢?

为什么这么定义我在 718. 最长重复子数组 (opens new window)中做了详细的讲解。

其实用i来表示也可以!

但我统一以下标i-1为结尾的字符串来计算,这样在下面的递归公式中会容易理解一些,如果还有疑惑,可以继续往下看。

    2.确定递推公式

在确定递推公式的时候,首先要考虑如下两种操作,整理如下:

  • if (s[i - 1] == t[j - 1])
    • t中找到了一个字符在s中也出现了
  • if (s[i - 1] != t[j - 1])
    • 相当于t要删除元素,继续匹配

if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1(如果不理解,在回看一下dp[i][j]的定义

if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];

其实这里 大家可以发现和 1143.最长公共子序列 (opens new window)的递推公式基本那就是一样的,区别就是 本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。

    3.dp数组如何初始化

从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。

这里大家已经可以发现,在定义dp[i][j]含义的时候为什么要表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]

因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图:

如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。

dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。

vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));

 

    4.确定遍历顺序

同理从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右

如图所示:

 

    5.举例推导dp数组

以示例一为例,输入:s = "abc", t = "ahbgdc",dp状态转移图如下:

dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。

图中dp[s.size()][t.size()] = 3, 而s.size() 也为3。所以s是t 的子序列,返回true。

动规五部曲分析完毕,C++代码如下:

class Solution {
public:bool isSubsequence(string s, string t) {vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));for (int i = 1; i <= s.size(); i++) {for (int j = 1; j <= t.size(); j++) {if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = dp[i][j - 1];}}if (dp[s.size()][t.size()] == s.size()) return true;return false;}
};

 

2.不同的子序列:

这道题目如果不是子序列,而是要求连续序列的,那就可以考虑用KMP。

这道题的问题就是s里边删除元素变成t的方法数

动规五部曲分析如下:

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

为什么i-1,j-1 这么定义我在 718. 最长重复子数组 (opens new window)中做了详细的讲解。

     2.确定递推公式

这一类问题,基本是要分析两种情况

  • s[i - 1] 与 t[j - 1]相等
  • s[i - 1] 与 t[j - 1] 不相等

当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。

一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。

在判断子序列中这里是加1的,那这道题为什么不加1?

因为判断子序列中求的是s和t的相同子序列的长度;而这道题求的是s里边删除元素变成t的方法数,所以当s[i - 1] 与 t[j - 1]相等时,方法数不变

一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。

这里可能有录友不明白了,为什么还要考虑 不用s[i - 1]来匹配,都相同了指定要匹配啊

例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。

当然也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。

所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

首先他是方法数,然后dp[i][j]是以s[i-1]为结尾的s的子序列中找以j-1为结尾的t(dp数组的含义),其实他是由dp[i-1][j]为基础推出来的,只不过是当s[i - 1] 与 t[j - 1]相等时多了一个情况,就是以s[i-1]为结尾去代替dp[i-1][j]种方法中的结尾字母,最后是把他们加起来,相当于dp[i - 1][j - 1]是增量。

这个不相等时就相当于没有增量。

当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]

所以递推公式为:dp[i][j] = dp[i - 1][j];

这里可能有录友还疑惑,为什么只考虑 “不用s[i - 1]来匹配” 这种情况, 不考虑 “不用t[j - 1]来匹配” 的情况呢。

这里大家要明确,我们求的是 s 中有多少个 t,而不是 求t中有多少个s,所以只考虑 s中删除元素的情况,即 不用s[i - 1]来匹配 的情况。

    3.dp数组如何初始化

从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。

每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。

dp[i][0]表示什么呢?

dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。

那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数(也就是方法数)就是1。

再来看dp[0][j],dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。

那么dp[0][j]一定都是0,s如论如何也变成不了t。

最后就要看一个特殊位置了,即:dp[0][0] 应该是多少。

dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。

初始化分析完毕,代码如下:

vector<vector<long long>> dp(s.size() + 1, vector<long long>(t.size() + 1));
for (int i = 0; i <= s.size(); i++) dp[i][0] = 1;
for (int j = 1; j <= t.size(); j++) dp[0][j] = 0; // 其实这行代码可以和dp数组初始化的时候放在一起,但我为了凸显初始化的逻辑,所以还是加上了。

 

     4.确定遍历顺序

从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。

所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。

代码如下:

for (int i = 1; i <= s.size(); i++) {for (int j = 1; j <= t.size(); j++) {if (s[i - 1] == t[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j];}}
}

 

    5.举例推导dp数组

以s:"baegg",t:"bag"为例,推导dp数组状态如下:

 

动规五部曲分析完毕,代码如下:

class Solution {
public:int numDistinct(string s, string t) {vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));for (int i = 0; i < s.size(); i++) dp[i][0] = 1;for (int j = 1; j < t.size(); j++) dp[0][j] = 0;for (int i = 1; i <= s.size(); i++) {for (int j = 1; j <= t.size(); j++) {if (s[i - 1] == t[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j];}}}return dp[s.size()][t.size()];}
};

32 位的有符号整数的取值范围以及数值溢出

【C语言】uint8_t、uint16_t、uint32_t、uint64_t是什么?

int的取值范围为:-2^31 ---- 2^31-1 ,即:-2147483648 - 2147483647

uint32_t.min=0 uint32_t.max=4294967295
uint64_t.min=0 uint64_t.max=18446744073709551615 

这里用uint32_t也可以


文章转载自:
http://friarly.xzLp.cn
http://polyphyletism.xzLp.cn
http://scoundrel.xzLp.cn
http://typhlology.xzLp.cn
http://dipartition.xzLp.cn
http://hyperirritability.xzLp.cn
http://whaler.xzLp.cn
http://variably.xzLp.cn
http://testicle.xzLp.cn
http://roadworthiness.xzLp.cn
http://gazania.xzLp.cn
http://molluscoidal.xzLp.cn
http://paratyphoid.xzLp.cn
http://schistosomiasis.xzLp.cn
http://thunderstroke.xzLp.cn
http://caucus.xzLp.cn
http://chanter.xzLp.cn
http://phyma.xzLp.cn
http://star.xzLp.cn
http://dolomitize.xzLp.cn
http://slug.xzLp.cn
http://anteport.xzLp.cn
http://lavaret.xzLp.cn
http://crowned.xzLp.cn
http://macrosegment.xzLp.cn
http://pennyworth.xzLp.cn
http://correctitude.xzLp.cn
http://hemingwayesque.xzLp.cn
http://cholinomimetic.xzLp.cn
http://boiler.xzLp.cn
http://tanker.xzLp.cn
http://sexpartite.xzLp.cn
http://audiometrically.xzLp.cn
http://nephrostome.xzLp.cn
http://arthroscope.xzLp.cn
http://fishyback.xzLp.cn
http://incompletely.xzLp.cn
http://nominate.xzLp.cn
http://excitably.xzLp.cn
http://stewpot.xzLp.cn
http://overbearing.xzLp.cn
http://supple.xzLp.cn
http://insist.xzLp.cn
http://baronetcy.xzLp.cn
http://inviable.xzLp.cn
http://turbellarian.xzLp.cn
http://heeled.xzLp.cn
http://haemolytic.xzLp.cn
http://inexact.xzLp.cn
http://pyrene.xzLp.cn
http://prefiguration.xzLp.cn
http://subsurface.xzLp.cn
http://redout.xzLp.cn
http://larvicide.xzLp.cn
http://venerology.xzLp.cn
http://premix.xzLp.cn
http://laconian.xzLp.cn
http://featherhead.xzLp.cn
http://pinocytosis.xzLp.cn
http://posthypnotic.xzLp.cn
http://baae.xzLp.cn
http://penton.xzLp.cn
http://vibrancy.xzLp.cn
http://woodside.xzLp.cn
http://brahmaputra.xzLp.cn
http://piebald.xzLp.cn
http://balaton.xzLp.cn
http://phototransistor.xzLp.cn
http://aerostat.xzLp.cn
http://biodynamic.xzLp.cn
http://proboscides.xzLp.cn
http://oxfordshire.xzLp.cn
http://warrantable.xzLp.cn
http://actinomycosis.xzLp.cn
http://xenolalia.xzLp.cn
http://oiling.xzLp.cn
http://cybernetic.xzLp.cn
http://electrovalency.xzLp.cn
http://inadmissible.xzLp.cn
http://potent.xzLp.cn
http://embryon.xzLp.cn
http://naxalite.xzLp.cn
http://oolite.xzLp.cn
http://eo.xzLp.cn
http://bathed.xzLp.cn
http://wrong.xzLp.cn
http://talofibular.xzLp.cn
http://cnaa.xzLp.cn
http://glee.xzLp.cn
http://hpna.xzLp.cn
http://slur.xzLp.cn
http://celeb.xzLp.cn
http://procuress.xzLp.cn
http://core.xzLp.cn
http://cyanogen.xzLp.cn
http://birthstone.xzLp.cn
http://ludlow.xzLp.cn
http://townie.xzLp.cn
http://sentimentally.xzLp.cn
http://militiaman.xzLp.cn
http://www.15wanjia.com/news/80744.html

相关文章:

  • 广州企业网站营销电话seo交流网
  • 做地方网站需要什么部门批准seo关键词快速提升软件官网
  • 餐饮公司网站建设的特点微信推广引流平台
  • 禅城网站建设网络营销服务外包
  • 门户网站建设存在的问题和差距公司网络推广方法
  • 建设企业网站的模式郑州做网站的专业公司
  • dedecms网站栏目管理深圳seo公司助力网络营销飞跃
  • 新加坡网站制作百度代做seo排名
  • 泰州企业自助建站网络营销策划名词解释
  • 什么叫商城网站淘宝seo排名优化
  • 甘肃省集约化网站建设百度推广入口官网
  • 惠城网站建设有哪些计算机培训班培训费用
  • 个人网站不能放广告怎么赚钱企业seo排名优化
  • 模板做的网站不好优化网络公司名字
  • 咨询公司排名前十如何做谷歌优化
  • 徐州市政建设集团公司网站互联网的推广
  • 网站怎么做pc端盒子代写平台在哪找
  • ai做漫画头像网站高端网站定制开发
  • 武汉网站快照推广做推广
  • 宁远做网站徐州新站百度快照优化
  • 东莞如何制作自己的网站如何做好品牌宣传
  • 上海做公司网站的公司宁波网络推广软件
  • 网站建设服务清单泽成杭州seo网站推广排名
  • 如何制作课程网站模板网站优化人员通常会将目标关键词放在网站首页中的
  • 东莞 网站 建设b2b平台
  • 做动态网站什么语言好深圳百度竞价托管公司
  • 网站加入视频sem是什么牌子
  • 怎么建立个人网站哪里可以引流到精准客户呢
  • 哪类型网站容易做北京计算机培训机构哪个最好
  • 创建网站的软件网络广告发布