首页 > 其他分享 >[动态规划]路径和与极值

[动态规划]路径和与极值

时间:2023-08-03 19:23:01浏览次数:22  
标签:obstacleGrid return 路径 极值 range 动态 col dp row

1. 斐波那契数列的第n项

def Fibonacci(self, n):
    if n==0: return 0
    if n==1: return 1
    a, b, c = 0, 1, -1
    for i in range(2, n + 1):
        c = a + b
        a = b
        b = c
    return c

2. 跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

方法:第一步找到适用于该题的状态表示,这里把状态函数设定为f(n),即跳了n个台阶的跳法总数。
现在需要通过先前的信息推导f(n),假设青蛙跳了n格,如果它是1跳到n格的,
那么一共f(n-1)种跳法;如果是2跳到n格的,那么一共f(n-2)种跳法,所以一共有f(n-1)+f(n-2)种跳法。

\[f(n)= \begin{cases} 1 & n=1 \\ 2 & n=2 \\ f(n-1) + f(n-2) & n>2 \end{cases} \]

3. Unique Paths

给一个m*n矩阵,从左上角到右下角一共多少条路径,要求只能走右边或者左边

方法:设定状态dp[row][col]为在row行col列的路径数,状态转移方程为

\[dp[row][col] = dp[row-1][col] + dp[row]p[col-1] \]

def uniquePaths(self, m, n):
    dp = [[1 for i in range(m)] for i in range(n)]
    for i in range(1, n):
        for j in range(1,m):
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
    return  dp[-1][-1]

4. Unique Paths II

在上题基础上加了障碍,下面1是障碍
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
Output: 2
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right

方法:在上题基础上状态转换关系还要考虑障碍情况,直接上代码
def uniquePathsWithObstacles(self, obstacleGrid):
    # type obstacleGrid: List[List[int]]
    row = len(obstacleGrid)
    col = len(obstacleGrid[0])
    dp = [[1] * col for i in range(row)]
    for i in range(0, row):
        for j in range(0, col):
            if obstacleGrid[i][j]: # 如果这个点是障碍
                dp[i][j] = 0
            elif i == 0:
                dp[i][j] = dp[i][j-1]
            elif j == 0:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
    return dp[-1][-1]

5. Triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
给以上这种三角形,返回从顶到底的元素和最小走法(每次只能走邻近子节点)
比如以上的结果:2 + 3 + 5 + 1 = 11

方法:第一步找到状态,可以设定从三角形某行某列到底部的元素和最小走法的元素和大小为dp[row][i]。
比如从2到底结果状态表示为dp[0][0],其可以被拆解成 min(从3到底的结果dp[1][0], 从4到底的结果dp[1][1]) + 2
状态转换关系即可确定: 

\[dp[row][i] = min(dp[row+1][i], dp[row+1][i+1]) + triagnle[row][i] \]

6. Minimum Path Sum

Input:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
Output: 7
非负二维数组,找到从左上角到右下角的路径,使得元素和最小
上图这个路径 1→3→1→1→1 元素和最小, 为7

方法:设定状态dp[row][col]表示从左上角走到row行col列元素和最小的路径的元素和大小。
状态转移方程为:(需要剪枝)

\[dp[row][col] = min(dp[row][col-1], dp[row-1][col]) + matrix[row][col] \]

标签:obstacleGrid,return,路径,极值,range,动态,col,dp,row
From: https://www.cnblogs.com/xytpai/p/17604238.html

相关文章

  • 2.相对路径和绝对路径
    2.相对路径和绝对路径1.绝对路径从根目录开始表示的路径,也就是从/开始,例如:/home/cmt/snap/home/cmt/snap/snapd-desktop-integration进入方法:cd/home/cmt/snapcd/home/cmt/snap/snapd-desktop-integration如图:2.相对路径从当前所处的目录开始表示的路径■.表示......
  • vue 动态绑定style class
    绑定style<!--基本使用--><div:style="{color:activeColor,fontSize:fontSize+'px'}">基本使用</div><!--数组--><div:style="styleArr">123</div><div:style="[astyle,bStyle]"&g......
  • 【SpringBoot学习】4、SpringBoot 配置本地资源映射路径已解决
    springboot配置本地资源映射路径需要配置一下映射资源位置,当时springboot1.x和spring波特2.x的配置方法不同,这里就分开记录一下配置过程。1、springboot1.x配置@ConfigurationpublicclassMyWebMvcConfigurerAdapterextendsWebMvcConfigurerAdapter{@Overri......
  • abp使用动态api客户端注意事项
    步骤按照官方的来就行API/DynamicCSharpAPIClients|DocumentationCenter|ABP.IO但有一点要注意,这也是官方文档没提及的,比如你在application这一层调用另一个项目的api客户端则要在application层的module里加上依赖,这个容易忘记。[DependsOn(typeof(Bank......
  • 动态规划三
    复健\(Day4\)动态规划(三)树形\(DP\)树形\(DP\)一般思路:从分析子树入手,最优解通常是与子树根节点\(u\)有关的函数,状态计算就是寻找根节点与子节点以及边权的递推关系编写代码,通常要\(DFS\),从根到叶,再从叶到根,在合适的时候\(DP\)\(1.\)没有上司的舞会https://www.luogu.com.cn/p......
  • 动态规划四
    复健\(day4\)动态规划(四)状压\(DP\)题目中的要求与位运算相关的表示:\(1.\)同一行不能有相邻的\(1\):\(if(!(i\&(i>>1)))\)\(2.\)某一行不能与上一行的正上方左上方和右上方同时有\(1\):\(!(a\&b)\)且\(!(a\&b>>1)\)且\(!(a\&b<<1)\)\(3.\)统计\(i\)包含的\(1\)的个数:\(......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • WPF动态绑定隐藏或显示DataGrid一列
     因为datagridtemplatecolumn不在VirsualTree中,不能继承DataGrid的DataContext,所以想要绑定到datagridtemplatecolumn的visibility,需要添加一个代理 一、添加一個FrameworkElement的代理<Window.Resources><FrameworkElementx:Key="ProxyElement"DataContext......
  • 129.动态编译与静态编译
    129.动态编译与静态编译1.静态编译静态编译是将程序代码和库函数一起编译成一个可执行文件的过程。在静态编译过程中,程序代码和库函数的代码被组合在一起,形成一个独立的可执行文件,该文件可以在任何系统上运行,因为它包含了所有所需的代码和库函数。1.1优点:1.程序在运行时不需要......
  • 恶意代码分析 动态行为分析 Lab3-1 Lab3-2 Lab3-3 Lab3-4
    笔记动态分析基础,这部分还没涉及到看反汇编进行分析,主要是运行程序,然后通过监控软件检测程序运行的内容使用沙箱查看运行报告,可以获取一部分信息首先要在虚拟机上运行恶意代码:如果是DLL,可以通过rundll32.exeDLLName,ExportFun来进行执行如果是服务DLL,则需要运行其中导出的安装服......