第9讲 深搜与简单的动态规划

合集下载

动态规划

动态规划

多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状 态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化 问题的方法为动态规划方法 。
任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适 用动态规划的问题必须满足最优化原理和无后效性 。
动态规划
运筹学的分支
01 原理
03 局限性
目录
02 分类
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年 代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理, 从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域, 并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了 显著的效果 。
最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成 的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足 最优化原理又称其具有最优子结构性质 。
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来 的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又 称为无后效性 。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因 素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点 。

第9讲 深搜与简单的动态规划

第9讲 深搜与简单的动态规划

procedure dfs(i,left,value:longint); //i:搜索第 件物品 判断放还是不放到背包里 件物品:判断放还是不放到背包里 :搜索第i件物品 // left:背包的剩余空间 : // value:已装物品的价值 : begin if i=n+1 then if value>best then best:=value; if i>n then exit; //防止溢出 防止溢出 dfs(i+1,left,value); //不装 不装i 不装 if left>=w[i] then //装i 装 dfs(i+1,left-w[i],value+v[i]); end;
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
procedure main;{顺推} begin f[1,1]:=a[1,1]; for i:=2 to n do for j:=1 to i do f[i,j]:=max(f[i-1,j-1],f[i-1,j])+a[i,j]; ans:=f[n,1]; for i:=2 to n do if f[n,i]>ans then ans:=f[n,i]; writeln(ans); end;
算法2: 算法 :
function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; Procedure dfs(i,j:integer); //求(i,j)到最后一行的最大和 求 到最后一行的最大和 begin if i=n then begin f[i,j]:=a[i,j]; exit; end; if f[i,j]>0 then exit; dfs(i+1,j); dfs(i+1,j+1); f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j]; end;

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例一、引言动态规划是一种求解最优化问题的算法,它具有广泛的应用领域,如机器学习、图像处理、自然语言处理等。

本文将详细介绍动态规划算法的原理,并提供一些使用案例,以帮助读者理解和应用这一算法的具体过程。

二、动态规划的基本原理动态规划算法通过将问题分解为多个子问题,并利用已解决子问题的解来求解更大规模的问题。

其核心思想是利用存储技术来避免重复计算,从而大大提高计算效率。

具体来说,动态规划算法通常包含以下步骤:1. 定义子问题:将原问题分解为若干个子问题,这些子问题具有相同的结构,但规模更小。

这种分解可以通过递归的方式进行。

2. 定义状态:确定每个子问题的独立变量,即问题的状态。

状态具有明确的定义和可计算的表达式。

3. 确定状态转移方程:根据子问题之间的关系,建立状态之间的转移方程。

这个方程可以是简单的递推关系式、递归方程或其他形式的方程。

4. 解决问题:使用递推或其他方法,根据状态转移方程求解每个子问题,直到获得最终解。

三、动态规划的使用案例1. 背包问题背包问题是动态规划算法的经典案例之一。

假设有一个背包,它能容纳一定重量的物品,每个物品有对应的价值。

目的是在不超过背包总重量的前提下,选取最有价值的物品装入背包。

这个问题可以通过动态规划算法来求解。

具体步骤如下:(1)定义问题:在不超过背包容量的限制下,选取物品使得总价值最大化。

(2)定义状态:令dp[i][j]表示将前i个物品放入容量为j的背包中所能获得的最大价值。

(3)状态转移方程:dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]),其中w[i]为第i个物品的重量,v[i]为第i个物品的价值。

(4)解决问题:根据状态转移方程依次计算每个子问题的解,并记录最优解,直到获得最终答案。

2. 最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的动态规划问题,它用于确定两个字符串中最长的共同子序列。

动态规划专题讲义

动态规划专题讲义


拦截导弹
问题描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹 拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每 一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于 该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于 30000的正整数,每个数据之间有一个空格),计算这套系统最多能拦截多少 导弹?如果要拦截所有导弹最少要配备多少套这种导弹拦截系统? 样例输入: 8 389 207 155 300 299 170 158 65 样例输出: 6(最多能拦截的导弹数) 2(要拦截所有导弹最少要配备的系统数)
“拦截导弹”问题分析 先讨论第一问:假设a[i]表示拦截的最后一枚导弹是第i枚时, 系统能拦得的最大导弹数。例如,样例中的a[5]=3,表示:如果 系统拦截的最后一枚导弹是高度为299的话,最多可以拦截第1枚 (389)、第4枚(300)、第5枚(299)三枚导弹。 显然,a[1]~a[8]中的最大值就是第一问的答案。关键是怎样 求得a[1]~a[8]? 我们换一个角度,假设现在已经求得a[1]~a[7](注:在动 态规划中,这样的假设往往是很必要的),那么怎样求a[8]呢?


根据上述递归式已经可以递归地求出最优解了。 用递归来完成搜索,算法设计如下: function make( i {处理到第i件物品} , j{剩余的空间为 j}:integer) :integer; {初始时i=m , j=背包总容量 } begin if (i=0)or(j=0) then begin make:=0;exit;end; if j>=wi then (背包剩余空间可以放下物品 i ) r1:=make(i-1,j-wi)+v[i]; (第i件物品放入所能得到的价值 ) r2:=make(i-1,j) (第i件物品不放所能得到的价值 ) make:=max{r1,r2} end;

动态规划算法教学PPT

动态规划算法教学PPT

03
动态规划算法的实现步骤
明确问题,建立数学模型
1
确定问题的目标和约束条件,将其转化为数学模 型。
2
理解问题的阶段划分,将问题分解为若干个子问 题。
3
确定状态变量和决策变量,以便描述子问题的状 态和决策。
划分阶段,确定状态变量和决策变量
01
根据问题的阶段划分,将问题分解为若干个子问题。
02
确定状态变量和决策变量,以便描述子问题的状态 和决策。
02
将子问题的最优解组合起来,得到原问题的最优解。
对最优解进行验证和性能评估,确保其满足问题的要求。
03
04
动态规划算法的优化技巧
分支定界法
分支定界法是一种求解优化问题的算 法,它通过不断生成问题的分支并确 定每个分支的界限,来寻找最优解。 在动态规划中,分支定界法可以用来 优化状态转移方程,减少计算量。
详细描述
多目标规划问题在实际生活中应用广泛,如资源分配、项目计划、城市规划等领 域都有涉及。常用的求解多目标规划的方法包括权重和法、帕累托最优解等。
多阶段决策问题
总结词
多阶段决策问题是动态规划中的一类,解决的问题需要在多个阶段做出决策,每个阶段的决策都会影响到后续阶 段的决策。
详细描述
多阶段决策问题在实际生活中应用广泛,如生产计划、库存管理、路径规划等领域都有涉及。常用的求解多阶段 决策问题的方法包括递归法、动态规划等。
特点
动态规划算法具有最优子结构、重叠 子问题和最优解性质等特征。
动态规划算法的应用领域
计算机科学
在计算机科学中,动态规划算法广泛应用于字符 串处理、排序、数据压缩和机器学习等领域。
电子工程
在电子工程中,动态规划算法用于信号处理、通 信和控制系统等领域。

动态规划的基本概念与方法

动态规划的基本概念与方法

动态规划的基本概念与方法动态规划(Dynamic Programming,简称DP)是解决一类最优化问题的一种方法,也是算法设计中的重要思想。

动态规划常用于具有重叠子问题和最优子结构性质的问题。

它将问题分解为子问题,并通过求解子问题的最优解来得到原问题的最优解。

动态规划的基本概念是“最优子结构”。

也就是说,一个问题的最优解可以由其子问题的最优解推导出来。

通过分解问题为若干个子问题,可以形成一个递归的求解过程。

为了避免重复计算,动态规划使用一个表格来保存已经计算过的子问题的解,以便后续直接利用。

这个表格也被称为“记忆化表”或“DP表”。

动态规划的基本方法是“状态转移”。

状态转移指的是,通过已求解的子问题的解推导出更大规模子问题的解。

常用的状态转移方程可以通过问题的递推关系定义。

通过定义好状态转移方程,可以通过迭代的方式一步步求解问题的最优解。

在动态规划中,通常需要三个步骤来解决问题。

第一步,定义子问题。

将原问题划分为若干个子问题。

这些子问题通常与原问题具有相同的结构,只是规模更小。

例如,对于计算斐波那契数列的问题,可以定义子问题为计算第n个斐波那契数。

第二步,确定状态。

状态是求解问题所需要的所有变量的集合。

子问题的解需要用到的变量就是状态。

也就是说,状态是问题(解决方案)所需要的信息。

第三步,确定状态转移方程。

状态转移方程通过已求解的子问题的解推导出更大规模子问题的解。

通常情况下,状态转移方程可以通过问题的递推关系确定。

在实际应用中,动态规划常用于求解最优化问题。

最优化问题可以归纳为两类:一类是最大化问题,另一类是最小化问题。

例如,最长递增子序列问题是一个典型的最大化问题,而背包问题是一个典型的最小化问题。

动态规划的优势在于可以解决许多复杂问题,并且具有可行的计算复杂度。

但是,动态规划也有一些限制。

首先,动态规划要求问题具有重叠子问题和最优子结构性质,不是所有问题都能够满足这两个条件。

其次,动态规划需要存储计算过的子问题的解,对于一些问题来说,存储空间可能会非常大。

背包问题的搜索解法

背包问题的搜索解法《背包问题九讲》的本意是将背包问题作为动态规划问题中的一类进行讲解。

但鉴于的确有一些背包问题只能用搜索来解,所以这里也对用搜索解背包问题做简单介绍。

大部分以01背包为例,其它的应该可以触类旁通。

简单的深搜对于01背包问题,简单的深搜的复杂度是O(2^N)。

就是枚举出所有2^N种将物品放入背包的方案,然后找最优解。

基本框架如下:procedure SearchPack(i,cur_v,cur_w)if(i>N)if(cur_w>best)best=cur_wreturnif(cur_v+v[i]<=V)SearchPack(i+1,cur_v+v[i],cur_w+w[i])SearchPack(i+1,cur_v,cur_w)其中cur_v和cur_w表示当前解的费用和权值。

主程序中调用SearchPack(1,0,0)即可。

搜索的剪枝基本的剪枝方法不外乎可行性剪枝或最优性剪枝。

可行性剪枝即判断按照当前的搜索路径搜下去能否找到一个可行解,例如:若将剩下所有物品都放入背包仍然无法将背包充满(设题目要求必须将背包充满),则剪枝。

最优性剪枝即判断按照当前的搜索路径搜下去能否找到一个最优解,例如:若加上剩下所有物品的权值也无法得到比当前得到的最优解更优的解,则剪枝。

搜索的顺序在搜索中,可以认为顺序靠前的物品会被优先考虑。

所以利用贪心的思想,将更有可能出现在结果中的物品的顺序提前,可以较快地得出贪心地较优解,更有利于最优性剪枝。

所以,可以考虑将按照“性价比”(权值/费用)来排列搜索顺序。

另一方面,若将费用较大的物品排列在前面,可以较快地填满背包,有利于可行性剪枝。

最后一种可以考虑的方案是:在开始搜索前将输入文件中给定的物品的顺序随机打乱。

这样可以避免命题人故意设置的陷阱。

以上三种决定搜索顺序的方法很难说哪种更好,事实上每种方法都有适用的题目和数据,也有可能将它们在某种程度上混合使用。

《动态规划》课件

《动态规划》ppt课 件
xx年xx月xx日
• 动态规划概述 • 动态规划的基本概念 • 动态规划的求解方法 • 动态规划的应用实例 • 动态规划的优化技巧 • 动态规划的总结与展望
目录
01
动态规划概述
定义与特点
定义
动态规划是一种通过将原问题分解为 相互重叠的子问题,并存储子问题的 解以避免重复计算的方法。
特点
动态规划适用于具有重叠子问题和最 优子结构的问题,通过将问题分解为 子问题,可以找到最优解。
动态规划的适用范围
最优化问题
01
动态规划适用于解决最优化问题,如最大/最小化问题、决策问
题等。
子问题重叠
02
动态规划适用于子问题重叠的情况,即子问题之间存在共享状
态或参数。
递归关系
03
动态规划适用于具有递归关系的问题,可以通过递归方式求解
机器调度问题
总结词
动态规划可以应用于机器调度问题,以确定最优的调度方案,满足生产需求并降低成本 。
详细描述
机器调度问题是一个经典的优化问题,涉及到如何分配任务到机器上,以最小化成本或 最大化效率。通过动态规划,可以将机器调度问题分解为一系列子问题,如确定每个任 务的调度顺序、分配机器等,并逐个求解子问题的最优解,最终得到整个调度方案的最
VS
详细描述
记忆化搜索法是一种优化技术,通过存储 已解决的子问题的解,避免重复计算,提 高求解效率。这种方法适用于子问题数量 较少且相互独立的情况。
04
动态规划的应用实例
最短路径问题
总结词
通过动态规划解决最短路径问题,可以找到 从起点到终点的最短路径。
详细描述
在图论中,最短路径问题是一个经典的优化 问题,旨在找到从起点到终点之间的一条路 径,使得路径上的所有边的权重之和最小。 动态规划是一种有效的解决方法,通过将问 题分解为子问题并存储子问题的解,避免了 重复计算,提高了求解效率。

动态规划专题完整ppt

then begin m:=s[c[k-1,j]]+v[c[k,i],c[k-1,j]]; d:=c[k-1,j]; end;
s[c[k,i]]:=m; { S[c[k,j] ] 记录第K个阶段的第J个结点到 终点的最短距离}
h[c[k,i]]:=d;{h[j]记录第j阶段最优路径经过的编号} end; end; writeln(s[n]);
三、动态规划中的几个概念
1、阶段
把解题的次序称为规划方向,把地位相同的结点称为一个 阶段。
2、状态
每一阶段的一个结点称为这个阶段的一个状态。如例1 中的第3阶段,有3个结点C1、C2、C3,称第3阶段有4种 状态,分别是C1、C2、C3。
3、状态转移方程 除边界外的任一阶段都得由其前面的阶段递推得到,这递
如:输入数据: N=7 4 3 2 1 4 4 t[i] 3 4 2 2 4 r[i] 输出 14 1 2+3 4+5 6+7
分析:
设F[i] 表示第i个人到第N个人买票所要的最小 时间。
F[i]=min{t[i]+f[i+1],r[i]+f[i+2] } (i=1,2,…,n-1)
F[n]=t[n] 目标是求f[1], 即所有歌迷总的买票时间的最小 值。
推的过程就表现出了阶段的动态演变。这种根据已有状态求得
未知状态的过程,我们称之为状态转移,状态转移的规则用数 学语言来描述,就称为状态转移方程。状态转移方程的形式多 样,如例1中的形式为G[i]=min{G[j]+ei,j},ei,j∈E。
例题2:排队买票问题
一场演唱会即将举行。现有N(0〈N<=200〉个歌迷 排队买票,一个人买一张,而售票处规定,一个人每次最 多只能买两张票。假设第i位歌迷买一张票需要时间Ti(1 〈=I〈=n〉,队伍中相邻的两位歌迷(第j个人和第j+1个 人)也可以由其中一个人买两张票,而另一位就可以不用 排队了,则这两位歌迷买两张票的时间变为Rj,假如 Rj<T(j)+T(j+1),则这样做就可以缩短后面歌迷等待的时间, 加快整个售票的进程。现给出N,Tj和Rj,求使每个人都买 到票的最短时间和方法。

NOIP从递归深搜到动态规划(C++)

NOIP从递归深搜到动态规划(C++)从递归深搜到动态规划提纲一、函数及其递归调用二、深度优先搜索三、动态规划一、函数及其递归调用一个C++程序无论大小都是由一个或多个“函数”组成。

其中必须有且只有一个main()函数,称之为“主函数”,由main()调用其它函数来完成程序的特定功能。

当然,其它函数之间也可以按照规则互相调用。

C++中的函数由一段相对独立的代码组成,这段代码能实现某一项具体、独立、完整的功能。

函数在程序设计中的作用主要有两个,一是“代码重用”,二是“问题分解”。

一、函数及其递归调用定义函数的格式如下:返回值类型函数名(参数列表){函数体}函数调用是通过“函数名”进行的,一般格式为:函数名(参数列表)一、函数及其递归调用函数调用方式有以下三种:(1)函数调用作为一条独立语句,完成一件事情,没有任何返回值。

例如:print(n);doit(dep,total);(2)函数调用的结果作为表达式的一部分。

例如:intt=compute(i,j)+ij;(3)以实参形式出现在其它函数调用中。

例如:number=min(sum(-5,100),n);num=max(max(a,b),c)。

一、函数及其递归调用例1、最大公约数【问题描述】输入两个正整数m和n,求它们的最大公约数。

【输入格式】一行两个正整数m和n,用一个空格隔开,2≤m,n≤10000。

【输出格式】一行一个整数,表示m和n的最大公约数。

【输入样例】2436【输出样例】12一、函数及其递归调用演示:欧几里德“辗转相除法”,体会其中的递归思想。

一、函数及其递归调用例2、分解质因子【问题描述】输入一个正整数n,用递归方法从小到大输出它的所有质因子(因子是质数)。

【输入格式】一行一个整数n,2≤n≤10000。

【输出格式】一行若干个整数,两数之间用一个空格隔开,从小到大输出。

【输入样例】18【输出样例】233一、函数及其递归调用如果n等于1,就没法再分解了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、数字三角形
有一个数字三角形,编程求从最顶层到最底层的一条路所经过 位置上数字之和的最大值。每一步只能向左下或右下方向走。下图 数据的路应为7->3->8->7->5,和为30。 7 输入: 3 8 第一行:R(1<=R<=100),数字三角形共有R行; 以下R行:依次表示数字三角形中每行中的数字。 8 1 0 每个数都是非负的,且<=100. 2 7 4 4 输出:一个正整数,路径上数字之和的最大值。 4 5 2 6 5 输入样例: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例: 30
Begin

init; fillchar(f,sizeof(f),0); dfs(1,1); writeln(f[1,1]); End.
算法3:
设f[i,j]:a[i,j]到达第n行a[n,k](k:1..n)的最大值. 递推关系: f[i,j]=max{f[i+1,j],f[i+1,j+1]}+a[i,j] 初始:f[n,i]:=a[n,i]; 1=<i<=n 目标:f[1,1]
算法4:
依次求从起点(1,1)到点(i,j)的最大值。//正向 设f[i,j]为从a[1,1]到达a[i,j]时取得的最大值. 根据题意可得出递推关系: f[i,j]=max{f[i-1,j-1],f[i-1,j]}+a[i,j] 初始:f[1,1]:=a[1,1]; 目标:max{f[n,i]} 1=<i<=n
样例输入: 6 7 7 1 2 1 4 2 4 2 6 4 4 4 7 6 6
样例输出: 5
算法1:dfs
C[i,j]=1表示(i,j)点有垃圾。C[i,j]=0表示没有。
procedure dfs(i,j,sum:longint); //从(i,j)走到终点(n,m)能捡到的垃圾数是sum
开始时:dfs(a[1,1],1,1); 结果:max
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
为什么当n较大时速度慢?
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
f:array[0..100,0..100] of integer; f[i,j] : (i,j) 到最后一行经过数的和的最大值 f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j]; 初始:f[n,i]=a[n,i] 目标:f[1,1]
第9讲 深搜与简单的动态规划
深度优先搜索算法的框架:
procedure dfs(i); //搜索第i个分量Xi begin if i=n +1 找到一个解 // if i=n+1 then exit; //防止数组越界 // 合适的剪枝优化:最优化剪枝与可行性剪枝 for Xi ∈Si且使得(X1,X2, 。。。Xi-1,Xi)满足约束条件 do begin 记录满足条件的Xi; // 添加相应的标志; dfs(i+1) // 删除标志;恢复之前的状态,根据具体情况选择: 回溯 end end
算法2:

function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; Procedure dfs(i,j:integer); //求(i,j)到最后一行的最大和 begin if i=n then begin f[i,j]:=a[i,j]; exit; end; if f[i,j]>0 then exit; dfs(i+1,j); dfs(i+1,j+1); f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j]; end;
总结:
算法1:一般的搜索(效率很低)。
算法2:记忆化搜索(效率高)。 算法3和算法4:动态规划算法(效率高)。
2、 Robots 机器人捡垃圾
在一个n*m的棋盘内,一些格子里有垃圾要拾捡。现在
有一个能捡垃圾的机器人从左上格子里出发,每次只能向 右或者向下走。每次他到达一个点,就会自动把这个点内 的垃圾拾掉。 问:机器人到达右下角时最多能拾多少垃圾。 数据范围:n<=100,m<=100
算法角形。 Procedure dfs(sum,i,j:integer); //从a[1,1]到走到第i行第j列即a[i,j]时所取得的值为sum begin if i=n then begin if sum>max then max:=sum; exit; end; dfs(sum+a[i+1,j],i+1,j); //向左下方走 dfs(sum+a[i+1,j+1],i+1,j+1); //向右下方走 end;
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
procedure main;{顺推} begin f[1,1]:=a[1,1]; for i:=2 to n do for j:=1 to i do f[i,j]:=max(f[i-1,j-1],f[i-1,j])+a[i,j]; ans:=f[n,1]; for i:=2 to n do if f[n,i]>ans then ans:=f[n,i]; writeln(ans); end;
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
function max(a,b:integer):integer; begin max:=a; if b>max then max:=b; end; procedure main; begin for i:=1 to n do f[n,i]:=a[n,i]; for i:=n-1 downto 1 do {枚举行} for j:=1 to i do {枚举每行的元素} f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[I,j];{枚举走法} writeln(f[1,1]); end;
相关文档
最新文档