蓝桥杯(状态定义动态最大值角形)

赛制(1)蓝桥杯OI赛制,a 每道题都可多次提交,每道题提交之后没有任何反馈,不限制提交次数,以最后一次提交的答案和案例为准,比赛中看不到任何排名,赛后按照总得分来排名b 每道题的类名均为Main, 直接输入输出,没必要有多余的输入语句c 判题过程几乎都有机器完成,只有编程大题会有少量的人工参与(人工参与只是需要对代码风格和可读性进行评判)算法-动态规划动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法
在面试笔试中动态规划也是经常作为考题出现,其中较为简单的DP题目我们应该有百分之百的把握顺利解决才可以
动态规划的解题核心主要分为两步:第一步:状态的定义第二步:状态转移方程的定义在这里,我们为了避免混淆用“状态”这个词来替代“问题”这个词
“问题”表示的含义类似:题目、要求解的内容、题干中的疑问句这样的概念
状态表示我们在求解问题之中对问题的分析转化
第一步:状态的定义有的问题过于抽象,或者过于啰嗦干扰我们解题的思路,我们要做的就是将题干中的问题进行转化(换一种说法,含义不变)
转化成一系列同类问题的某个解的情况,比如说:题目:求一个数列中最大连续子序列的和
我们要将这个原问题转化为:状态定义:Fk是第k项前的最大序列和,求F1~FN中最大值
通过换一种表述方式,我们清晰的发现了解决问题的思路,如何求出F1~FN中的最大值是解决原问题的关键部分
上述将原问题转化成另一种表述方式的过程叫做:状态的定义
这样的状态定义给出了一种类似通解的思路,把一个原来毫无头绪的问题转换成了可以求解的问题
第二步:状态转移方程的定义在进行了状态的定义后,自然而然的想到去求解F1~FN中最大值
这也是状态定义的作用,让我们把一个总体的问题转化成一系列问题,而第二步:状态转移方程的定义则告诉我们如何去求解一个问题,对于上述已经转换成一系列问题我们要关注的点就在于:如何能够用前一项或者前几项的信息得到下一项,这种从最优子状态转换为下一个最优状态的思路就是动态规划的核心
对于上面的例子题目来说,状态转移方程的定义应该是:Fk=max{Fk-1+Ak,Ak} Fk是前k项的和,Ak是第k项的值仔细思考一番,我们能够得到这样的结论,对于前k个项的最大子序列和是前k-1项的最大子序列和Fk与第k项的和、或者第k项两者中较大的
如果大家还是不能理解这个原理建议用演算纸自己计算一番,这里就不过多赘述了
这种状态转移的思路就是DP的核心
动态规划的应用场景看过了如何去使用动态规划,那么随之而来的问题就在于:既然动态规划不是某个固定的算法,而是一种策略思路,那么什么时候应该去使用什么时候不能用呢?答案很简单:对于一个可拆分问题中存在可以由前若干项计算当前项的问题可以由动态规划计算
例题1: 数塔取数问题一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值
每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上
该三角形第n层有n个数字,例如:第一层有一个数字:5第二层有两个数字:8 4第三层有三个数字:3 6 9第四层有四个数字:7 2 9 5最优方案是:5 + 8 + 6 + 9 = 28注意:上面应该是排列成一个三角形的样子不是竖向对应的,排版问题没有显示成三角形
状态定义: Fi,j是第i行j列项最大取数和,求第n行Fn,m(0 < m < n)中最大值
状态转移方程:Fi,j = max{Fi-1,j-1,Fi-1,j}+Ai,jtpackage com.hust0328;import java.util.Scanner;/ Created by huststl on 2018/3/28 14:24 动态规划题01 /public class Dp01 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); long max = 0; int[][] dp = new int[n][n]; dp[0][0] = scan.nextInt(); for(int i=1;i<n;i++){ for(int j=0;j<=i;j++){ int num = scan.nextInt(); if(j==0){ dp[i][j] = dp[i-1][j] + num; }else { dp[i][j] = Math.max(dp[i-1][j-1],dp[i - 1][j])+num; } max = Math.max(dp[i][j],max); } } System.out.println(max); }}其他算法后续会持续更新,2023年蓝桥杯比赛是4月8号,希望喜欢的朋友双击点赞+关注,需要蓝桥杯算法代码和视频的朋友,评论区留下你的联系方式,后面会联系并发给你
蓝桥杯(状态定义动态最大值角形)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息