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

大连网站建设网站建设app软件开发的费用设计

大连网站建设网站建设,app软件开发的费用设计,食品厂招男女工5000,wordpress 评论 样式目录 子数组问题 1.最大数组和 2.等差数列划分 3.单词拆分 本文旨在通过对力扣上三道题进行讲解来让大家对使用动态规划解决多状态有一定思路,培养大家对状态定义,以及状态方程书写的思维。 顺序: 题目链接-》算法思路-》代码呈现 子数组…

 

目录

 子数组问题

1.最大数组和 

2.等差数列划分

3.单词拆分


        本文旨在通过对力扣上三道题进行讲解来让大家对使用动态规划解决多状态有一定思路,培养大家对状态定义,以及状态方程书写的思维。

顺序:

题目链接-》算法思路-》代码呈现

 子数组问题

动态规划类题目解题步骤:

  1. 依据题目进行状态表示(dp[i]的含义)
  2. 写出状态转移方程(类似于dp[i]=dp[i-1]+dp[i-2])
  3. 为防止填表时数组越界,对dp表进行初始化(dp[0]=dp[1]=1)
  4. 搞清楚填表顺序(从前往后或者从后往前)
  5. 利用dp表返回问题答案

1.最大数组和 

题目链接:

https://leetcode.cn/problems/maximum-subarray/

 

算法思路:

1. 状态表⽰:
        对于线性 dp ,我们可以⽤「经验 + 题⽬要求」来定义状态表⽰:
  1. 以某个位置为结尾,巴拉巴拉;
  2. 以某个位置为起点,巴拉巴拉。
这⾥我们选择⽐较常⽤的⽅式,以「某个位置为结尾」,结合「题⽬要求」,定义⼀个状态表⽰:
dp[i] 表⽰:以 i 位置元素为结尾的「所有⼦数组」中和的最⼤和。
2. 状态转移⽅程:
        dp[i] 的所有可能可以分为以下两种:
  1. ⼦数组的⻓度为 1 :此时 dp[i] = nums[i]
  2. ⼦数组的⻓度⼤于 1 :此时 dp[i] 应该等于 以 i - 1 做结尾的「所有⼦数组」中和的最⼤值再加上 nums[i] ,也就是 dp[i - 1] + nums[i]
由于我们要的是「最⼤值」,因此应该是两种情况下的最⼤值,因此可得转移⽅程:
dp[i] = max(nums[i], dp[i - 1] + nums[i])
3. 初始化:
        可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
  1. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
  2. 「下标的映射关系」。
在本题中,最前⾯加上⼀个格⼦,并且让 dp[0] = 0 即可。
4. 填表顺序:
        根据「状态转移⽅程」易得,填表顺序为「从左往右」。
5. 返回值:
        状态表⽰为「以 i 为结尾的所有⼦数组」的最⼤值,但是最⼤⼦数组和的结尾我们是不确定的。因此我们需要返回整个 dp 表中的最⼤值。

代码呈现:

class Solution {public int maxSubArray(int[] nums) {int n=nums.length;int[] dp=new int[n+1];dp[0]=-10000007;int re=dp[0];for(int i=1;i<=n;i++){dp[i]=Math.max(dp[i-1]+nums[i-1],nums[i-1]);re=re>dp[i]?re:dp[i];}return re;}
}

2.等差数列划分

题目链接:

https://leetcode.cn/problems/arithmetic-slices/

 

算法思路:

1. 状态表⽰:
        由于我们的研究对象是「⼀段连续的区间」,如果我们状态表⽰定义成 [0, i] 区间内⼀共有多少等差数列,那么我们在分析 dp[i] 的状态转移时,会⽆从下⼿,因为我们不清楚前⾯那么多的「等差数列都在什么位置」。所以说,我们定义的状态表⽰必须让等差数列「有迹可循」,让状态转移的时候能找到「⼤部队」。因此,我们可以「固定死等差数列的结尾」,定义下⾯的状态表⽰:
dp[i] 表⽰必须「以 i 位置的元素为结尾」的等差数列有多少种。
2. 状态转移⽅程:
        我们需要了解⼀下等差数列的性质:如果 a b c 三个数成等差数列,这时候来了⼀个 d ,其中 b c d 也能构成⼀个等差数列,那么 a b c d 四个数能够成等差序列吗?答案是:显然的。因为他们之间相邻两个元素之间的差值都是⼀样的。有了这个理解,我们就可以转⽽分析我们的状态转移⽅程了。
对于 dp[i] 位置的元素 nums[i] ,会与前⾯的两个元素有下⾯两种情况:
  1. nums[i - 2], nums[i - 1], nums[i] 三个元素不能构成等差数列:那么以nums[i] 为结尾的等差数列就不存在,此时 dp[i] = 0
  2. nums[i - 2], nums[i - 1], nums[i] 三个元素可以构成等差数列:那么以nums[i - 1] 为结尾的所有等差数列后⾯填上⼀个 nums[i] 也是⼀个等差数列,此时dp[i] = dp[i - 1] 。但是,因为 nums[i - 2], nums[i - 1], nums[i] 三者⼜能构成⼀个新的等差数列,因此要在之前的基础上再添上⼀个等差数列,于是dp[i] = dp[i - 1] + 1 。
综上所述:状态转移⽅程为:
当: nums[i - 2] + nums[i] != 2 * nums[i - 1] 时, dp[i] = 0
当: nums[i - 2] + nums[i] == 2 * nums[i - 1] 时, dp[i] = 1 + dp[i - 1]
3. 初始化:
        由于需要⽤到前两个位置的元素,但是前两个位置的元素⼜⽆法构成等差数列,因此 dp[0] = dp[1] = 0 。
4. 填表顺序:
        毫⽆疑问是「从左往右」。
5. 返回值:
        因为我们要的是所有的等差数列的个数,因此需要返回整个 dp 表⾥⾯的元素之和。

代码呈现:

class Solution {public int numberOfArithmeticSlices(int[] nums) {int n=nums.length;int[] dp=new int[n];for(int i=2;i<n;i++){dp[i]=(nums[i]-nums[i-1])==(nums[i-1]-nums[i-2])?dp[i-1]+1:0;}int sum=0;for(int j=0;j<n;j++){sum+=dp[j];}return sum;
}
}

3.单词拆分

题目链接:

https://leetcode.cn/problems/word-break/ 

 

算法思路:

1. 状态表⽰:
        对于线性 dp ,我们可以⽤「经验 + 题⽬要求」来定义状态表⽰:
  1. 以某个位置为结尾,巴拉巴拉;
  2. 以某个位置为起点,巴拉巴拉。
这⾥我们选择⽐较常⽤的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表⽰:
dp[i] 表⽰: [0, i] 区间内的字符串,能否被字典中的单词拼接⽽成。
2. 状态转移⽅程:
        对于 dp[i] ,为了确定当前的字符串能否由字典⾥⾯的单词构成,根据最后⼀个单词的起始位置 j ,我们可以将其分解为前后两部分:
  1. 前⾯⼀部分 [0, j - 1] 区间的字符串;
  2. 后⾯⼀部分 [j, i] 区间的字符串。
其中前⾯部分我们可以在 dp[j - 1] 中找到答案,后⾯部分的⼦串可以在字典⾥⾯找到。
因此,我们得出⼀个结论:当我们在从 0 ~ i 枚举 j 的时候,只要 dp[j - 1] = true
并且后⾯部分的⼦串 s.substr(j, i - j + 1) 能够在字典中找到,那么 dp[i] = true 。
3. 初始化:
        可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
  1. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
  2. 「下标的映射关系」。
在本题中,最前⾯加上⼀个格⼦,并且让 dp[0] = true ,可以理解为空串能够拼接⽽成。
其中为了⽅便处理下标的映射关系,我们可以将字符串前⾯加上⼀个占位符 s = ' ' + s ,这样就没有下标的映射关系的问题了,同时还能处理「空串」的情况。
4. 填表顺序:
        显⽽易⻅,填表顺序「从左往右」。
5. 返回值:
        由「状态表⽰」可得:返回 dp[n] 位置的布尔值。
哈希表优化的⼩细节:
        在状态转移中,我们需要判断后⾯部分的⼦串「是否在字典」之中,因此会「频繁的⽤到查询操作」。为了节省效率,我们可以提前把「字典中的单词」存⼊到「哈希表」中。

代码呈现:

class Solution {public boolean wordBreak(String s, List<String> wordDict) {int n=s.length();boolean[] dp=new boolean[n+1];dp[0]=true;for(int i=0;i<n;i++){for(int j=0;j<=i;j++){String tmp=s.substring(j,i+1);if(wordDict.contains(tmp)&&dp[j]){dp[i+1]=true;}}}return dp[n];}
}

 

http://www.dtcms.com/wzjs/597531.html

相关文章:

  • 做网站哪家好 张家口南通网站建设报价
  • 做泵阀到哪个网站好网络维护培训
  • 国内网站做得好的公司四川住建厅官方网站的网址
  • 优质服务的小企业网站建设凯里网站建设公司哪家好
  • 网站开发网络公司兼职wordpress全站网易云音乐播放
  • 中山手机网站开发互联网产品代理项目
  • 广告图片网站嘉兴市建设官方网站
  • 提供免费服务器的网站宝安做网站信科
  • 公司官网网站建设建设工程施工合同条例
  • 易语言怎么做点击按钮打开网站烟台网站建设联系企汇互联专业
  • 阳网站建设google 字体 wordpress
  • python做网站比php网络营销的优势是什么
  • 不懂英文怎么做英文的seo网站网吧手机网站模版
  • 旅游网站建设技术解决方案移动互联网开发考试
  • 网站建设怎么进后台互联网推广策划
  • 湖北省建设厅监督网站知名网站制作全包
  • 网站建设费用推荐网络专业网站开发具体是干什么的
  • 网站赚钱方法wordpress4.9火车头发布模板
  • 网站创建怎么做网站开发教程全集
  • 什么网站做婚礼请柬seo快速排名网站优化
  • 网站的弹窗怎么做沈阳世纪兴电子商务服务中心
  • 一个网站需要多少空间国内知名展馆设计公司排名
  • 任丘建设银行网站手机网站欢迎页面
  • asp网站如何安装如何设计网站步骤
  • 建设无障碍网站商务网站建设PDF下载
  • 做婚庆网站江西冰溪建设集团网站
  • 做百度网站营业执照用注销吗辽宁建设执业信息网官网
  • 用什么网站做海报wordpress性能
  • 如何 html5 网站浙江省建设网证书查询
  • 邯郸市旅游景点有哪些深圳优化公司义高粱seo