动态规划算法练习(5)--medium
时间:2022-07-24
本文章向大家介绍动态规划算法练习(5)--medium,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 预测赢家(leetcode 486. Predict the Winner)
中文链接:https://leetcode-cn.com/problems/predict-the-winner/ 英文链接:https://leetcode.com/problems/predict-the-winner/
题目:
我们可以分成两种情况来考虑,当这个数组数目是偶数时,先手是必胜的。在选择同样数目的数字时,先手可以选择加和更大的组合; 对于总数目是奇数的情况,我们可以构建一个二维数组dp,来存放第i到j位置的这些数字先手和后手的得分差值。比如说,对于示例2,当i=0, j=0时,只有一种选择,也就是先手拿1,差值为1,dp[0][0] = 1;当i=0, j = 1时,数组为[1,5],先手拿5,后手拿1,差为4,dp[0][1] = 4;....... 那么,在dp[i][j]位置的值是什么呢? 假如先手拿nums[i],那么与后手的差就是nums[i] - dp[i+1][j];先手拿nums[j],那么与后手的差即nums[j] - dp[i][j-1]。以下是python实现:
class Solution:
def PredictTheWinner(self, nums: List[int]) -> bool:
n = len(nums)
if not n % 2:
return True
dp = [[0 for x in range(n)] for y in range(n)]
for i in range(n):
dp[i][i] = nums[i]
for i in range(n-2, -1, -1):
for j in range(i+1, n):
dp[i][j] = max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1])
return dp[0][-1]>=0
2. 打家劫舍 II (213. House Robber II)
中文链接:https://leetcode-cn.com/problems/house-robber-ii/ 英文链接:https://leetcode.com/problems/house-robber-ii/
image.png
打家劫舍的进阶版题型。不能同时选首位和末尾数字。所以这里可以构建一个n行两列的数组,第一列表示第一个数字而不选最后一个,第二列表示选择最后一个数。其他的地方与打家劫舍I一样。python实现:
class Solution:
def rob(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
if n <= 3:
return max(nums)
else:
dp = [[0,0] for x in range(n)]
dp[0][0],dp[1][0] = nums[0], max(nums[0], nums[1])
dp[1][1], dp[2][1] = nums[1], max(nums[1], nums[2])
for i in range(2, n - 1):
dp[i][0] = max(dp[i-2][0] + nums[i], dp[i-1][0])
dp[i+1][1] = max(dp[i-1][1] + nums[i+1], dp[i][1])
return max(dp[-1][1], dp[-2][0])
- HDUOJ----(4706)Children's Day
- poj-------Common Subsequence(poj 1458)
- poj----Maximum sum(poj 2479)
- HDUOJ---hello Kiki
- HDUOJ-----X问题
- POJ-----C Looooops
- POJ--Strange Way to Express Integers
- HDUOJ----More is better(并查集)
- HDUOJ 1099——Lottery
- HDUOJ-----取(m堆)石子游戏
- HDUOJ-----Be the Winner
- HDUOJ-------- Fibonacci again and again
- HDUOJ----Good Luck in CET-4 Everybody!
- 进制转换
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试速记之数据库增删改查|附思维导图
- 图深度学习入门教程(十)——深度图互信息模型
- Python3笔试实际操作基础3.md
- python线程(二)代码部分Threading模块
- python threading.current_thread().name和.getName()有什么区别
- Golang是如何操作excel的?
- Typecho配置多国语支持,检查客户端语言自动切换翻译
- NgModule imports定义的运行时数据结构
- 用Windows电脑训练深度学习模型?超详细配置教程来了
- Angular No provider for EffectsRootModule错误消息
- Leetcode No.15 三数之和
- 正则表达式介绍与使用
- Angular StoreFeatureModule
- Angular Component之间的事件通知机制
- 如何将你的Python项目全面自动化?