首页 > 其他分享 >Dynamic Programming

Dynamic Programming

时间:2023-11-14 11:33:57浏览次数:36  
标签:nums 树根 Programming 路径 Dynamic 打家劫舍 节点 dp

目录
参考:https://cloud.tencent.com/developer/article/1692068

热身

斐波那契数列

递归求解

自顶向下,存在大量的重复计算

image-20231111090244992

动态规划

保存中间状态,利用保存的历史状态求解问题,减少了重复计算,空间换时间。

image-20231111090434541

空间复杂度优化

只需借助两个变量dp1、dp2

image-20231111091942235

解题步骤:

步骤一:定义dp数组的含义
步骤二:定义状态转移方程
步骤三:初始化过程转移的初始值
步骤四:可优化点(可选)

198. 打家劫舍

  1. dp[i]:到第i户时,抢得最大金额

  2. 状态转移方程

    • 偷第i户

      不能连着偷,dp[i] = dp[i-2] + nums[i-1],此处用i-1是因为第i户,抢得金额刚好对应的nums[i-1]

    • 不偷第i户

      dp[i] = dp[i-1]

    综上

    dp[i] =  max(dp[i-2] + nums[i-1], dp[i-1])
    
  3. 初始值

    dp[0] = 0			// 还没开始偷
    dp[1] = nums[0]		// 到了第1户直接偷
    

62. 不同路径

  1. dp(i,j)

    走到(i,j)处的不同路径数

  2. 状态转移方程

    只能向下或向右走,到达(i,j)位置,要么从上面的位置(i-1,j)处来,要么从左边得位置(i,j-1)处来

    dp(i,j) = dp(i-1,j) + dp(i,j-1)

  3. 初始值

    dp(0,0) = 1

    第一行的所有位置(0,i),只能由起始点向右走,只有一种路径;同理,第一列的位置(i,0),只能由起始点向下走,也都只有一种路径。

63. 不同路径 II

路径上有障碍物

  1. dp(i,j)

    走到(i,j)处的不同路径数

  2. 状态转移方程

    • 没有障碍物的情况下

      只能向下或向右走,到达(i,j)位置,要么从上面的位置(i-1,j)处来,要么从左边的位置(i,j-1)处来

      dp(i,j) = dp(i-1,j) + dp(i,j-1)

    • 有障碍物

      dp(i,j) = 0

  3. 初始值

    第一行的所有位置,只要遇到一个障碍物,其后的所有都不可达,均置为0;第一列同理。

213. 打家劫舍 II

环形打家劫舍,首户和尾户不能同时抢

思路:

  • 只有1户,直接抢即可

  • 只有2户,抢最大金额即可

  • 超过2户,需要考虑两者情况(抢首户 or 抢尾户),再取较大者

  1. dp[i]

    表示抢第i户所得最大金额

  2. 状态转移方程

    同打家劫舍Ⅰ

  3. 边界条件

    dp[0] = 0;

    dp[1] = nums[0]; //抢首户不抢尾户

    dp[1] = nums[1]; //抢尾户不抢首户

337. 打家劫舍 III

子问题

树中每个节点都有 不选 两种选择。子问题subproblem定义为,子树根节点的抢得最大金额 和 子树根节点不选的抢得最大金额;原问题的解就是 max(sub(根节点选), sub(根节点不选))

c++ 实现,二叉树后序遍历,用2个hash表存储,选或不选每个节点的子问题的解

定义f表存储选子树根节点的最优解,g表存储不选子树根节点的最优解

状态转移方程

  • f[t] = t->val + g[t->left] + g[t->right]

    选子树根节点,则左右子节点均不能选

  • g[t] = max(f[t->left], g[t->left]) + max(f[t->right], g[t->right])

    不选子树根节点,左子树根节点可选可不选,取最大值;右子树同理

标签:nums,树根,Programming,路径,Dynamic,打家劫舍,节点,dp
From: https://www.cnblogs.com/dctwan/p/17831228.html

相关文章

  • Programming Abstractions in C阅读笔记:p196
    《ProgrammingAbstractionsinC》学习第63天,p196总结。涉及到编程之外的知识,依然是读起来很费劲,需要了解作者在书中提到的人物(EdouardLucas)、地点(Benares)、神话传说(Brahma)等等。虽然深知自己做不到对人文知识,历史知识精通,但也希望能记住,从而在下次遇到的时候能够阅读下去......
  • Toyota Programming Contest 2023#7(AtCoder Beginner Contest 328)
    ToyotaProgrammingContest2023#7(AtCoderBeginnerContest328)A.NotTooHard题意:将给定的数列\(a\)中数值小于\(x\)的数累加。解题思路:模拟。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){ intn,x; cin>>n>>x;......
  • 如何用Angular or Vue 来 实现Dynamics 365 WebResource 开发
    第一步:构建Angular项目,可以使用VisualStudio的项目模版创建(含.netCore相关)或者使用Angularcli创建,我习惯使用angularcli 执行以下命令:ngnew项目名称,回车可以选择含路由,style是CSSorLESS根据所需选取,稍等几分钟(取决于网络,会download......
  • The 10th Jimei University Programming Contest
    外校打星队伍,排名22/450,还算凑合吧。A.A+B问题直接枚举进制#include<bits/stdc++.h>usingnamespacestd;usingvi=vector<int>;voidsolve(){stringstr;via,b,s;cin>>str;for(autoc:str){if(c>='0'and......
  • HHKB Programming Contest 2023(AtCoder Beginner Contest 327) 赛后总结
    HHKBProgrammingContest2023(AtCoderBeginnerContest327)赛后总结又没来得及写题解。。。赛时A-ab查找ab和ba,只要其中一者存在就行。#include<bits/stdc++.h>usingnamespacestd;intn;strings;intmain(){cin>>n>>s;cout<<(s.find("a......
  • Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contes
    JapanRegistryServices(JPRS)ProgrammingContest2023(AtCoderBeginnerContest324)赛后总结可悲的是:我没来得及写题解。TaskASame秒切。直接输入排一遍序再遍历即可。#include<bits/stdc++.h>usingnamespacestd;intn,a[101];intmain(){cin>>n;......
  • HHKB Programming Contest 2023(AtCoder Beginner Contest 327)
    HHKBProgrammingContest2023(AtCoderBeginnerContest327)A-abintmain(){IOS;strings;cin>>n>>s;boolf=false;for(inti=1;i<n;++i)if(s[i-1]=='a'&&s[i]=='b&#......
  • HHKB Programming Contest 2023(AtCoder Beginner Contest 327)
    HHKBProgrammingContest2023(AtCoderBeginnerContest327)A.ab解题思路:模拟即可。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){intn;cin>>n;strings;cin>>s;for(inti=0......
  • [935] Python Programming in QGIS3
    ref:GettingStartedWithPythonProgramming(QGIS3)ref:1.4.1.UsingPyQGISinstandalonescripts ......
  • 【算法笔记】动态规划Dynamic Programming
    参考视频:5SimpleStepsforSolvingDynamicProgrammingProblems引子:最长递增子串(LongestIncreasingSubsequence,LIS)LIS([31825])=len([125])=3LIS([52863695])=len([2369])=4解决问题的三个步骤:可视化例子(visualizeexample)(“visualizee......