
动态规划
文章平均质量分 71
dp
Whisper_yl
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode: 526. 优美的排列(状态压缩DP)
假设有从 1 到 N 的N个整数,如果从这N个数字中成功构造出一个数组,使得数组的第 i位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:第i位的数字能被i整除i 能被第 i 位上的数字整除现在给定一个整数 N,请问可以构造多少个优美的排列?示例1:输入: 2输出: 2解释:第 1 个优美的排列是 [1, 2]: 第 1 个位置(i=1)上的数字是1,1能被 i(i=1)整除 第 2 个位置(i=...原创 2021-08-16 23:18:32 · 311 阅读 · 0 评论 -
LeetCode: 5815. 扣分后的最大得分
给你一个m x n的整数矩阵points(下标从 0开始)。一开始你的得分为 0,你想最大化从矩阵中得到的分数。你的得分方式为:每一行中选取一个格子,选中坐标为(r, c)的格子会给你的总得分 增加points[r][c]。然而,相邻行之间被选中的格子如果隔得太远,你会失去一些得分。对于相邻行r 和r + 1(其中0 <= r < m - 1),选中坐标为(r, c1) 和(r + 1, c2)的格子,你的总得分减少abs(c1 - c2)。...原创 2021-07-18 21:17:39 · 241 阅读 · 1 评论 -
LeetCode: “马”在棋盘上的概率
已知一个NxN的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为(0, 0),最右下角的记为(N-1, N-1)。现有一个 “马”(也译作 “骑士”)位于(r, c),并打算进行K 次移动。如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。...原创 2021-06-04 20:19:36 · 347 阅读 · 0 评论 -
LeetCode: 377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例 1:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。示例 2:输入:nums.原创 2021-04-27 21:38:24 · 120 阅读 · 0 评论 -
LeetCode: 337. 打家劫舍 III
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ ...原创 2020-08-05 18:59:49 · 195 阅读 · 0 评论 -
LeetCode: 410. 分割数组的最大值
给定一个非负整数数组和一个整数m,你需要将这个数组分成m个非空的连续子数组。设计一个算法使得这m个子数组各自和的最大值最小。注意:数组长度n满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将其分为[7,2,5] 和 [10,8],因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。分析...原创 2020-07-30 13:47:35 · 349 阅读 · 0 评论 -
LeetCode: 343. 整数拆分
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 ×3 ×4 = 36。说明: 你可以假设n不小于 2 且不大于 58。分析: 求最大乘积,可以考虑动态规划的方法。设置dp数组,定义dp[i]为将i按题意拆分,可获得的最大乘积。 我...原创 2020-07-30 10:32:32 · 223 阅读 · 0 评论 -
LeetCode: 309. 最佳买卖股票时机含冷冻期
给定一个整数数组,其中第i个元素代表了第i天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]分析: 这个题需要求最大值,我们会想到用动归的方法。此题确定dp...原创 2020-07-12 00:07:43 · 142 阅读 · 0 评论 -
LeetCode: 面试题 17.13. 恢复空格
哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboot"。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相对原题稍作改动,只需返原创 2020-07-10 23:30:12 · 210 阅读 · 0 评论 -
LeetCode: 44. 通配符匹配
给定一个字符串(s) 和一个字符模式(p) ,实现一个支持'?'和'*'的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s可能为空,且只包含从a-z的小写字母。p可能为空,且只包含从a-z的小写字母,以及字符?和*。示例1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例2:输入:s = "aa"p...原创 2020-07-05 16:57:35 · 221 阅读 · 0 评论 -
LeetCode: 32. 最长有效括号
给定一个只包含 '('和 ')'的字符串,找出最长的包含有效括号的子串的长度。示例1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"分析: 解决这个问题,我主要的思路还是动态规划,问题是怎么写状态转移方程。首先要定义一个dp数组,如果是一维,那么dp[i]代表什么含义?如果是二维,那么dp[i][j]代表什么?又怎样构造状态转移方程?我觉得还是从一维开始考虑,...原创 2020-07-04 22:44:05 · 208 阅读 · 0 评论 -
LeetCode: 08.02 迷路的机器人(二维dp)
设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。网格中的障碍物和空位置分别用 1 和 0 来表示。返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。示例1:输入:[[0,0,0],[0,1,0],[0...原创 2020-04-08 16:05:55 · 335 阅读 · 0 评论 -
LeetCode: 152. 乘积最大子数组
给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)。示例 1:输入: [2,3,-2,4]输出: 6解释:子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释:结果不能为 2, 因为 [-2,-1] 不是子数组。分析: 我们尝试用动态规划来解决这个问题,设立一个数组,d...原创 2020-04-06 23:49:32 · 251 阅读 · 0 评论 -
数组分拆
描述小Ho得到了一个数组作为他的新年礼物,他非常喜欢这个数组!在仔细研究了几天之后,小Ho成功的将这个数组拆成了若干段,并且每段的和都不为0!现在小Ho希望知道,这样的拆分方法一共有多少种?两种拆分方法被视作不同,当且仅当数组断开的所有位置组成的集合不同。输入每组输入的第一行为一个正整数N,表示这个数组的长度第二行为N个整数A1~AN,描述小Ho收到的这个数组对于40%...原创 2020-04-02 17:57:12 · 799 阅读 · 0 评论 -
圆形石子合并问题
题目描述在一个圆形操场的四周摆放着n堆石子。 现要将石子有次序地合并成一堆。 规定每次选2堆石子合并成新的一堆,合并的费用为新的一堆石子数。试设计一个算法,计算出将n堆石子合并成一堆的最小总费用。输入输入数据第1行有1个正整数n(1≤n≤1000),表示有n堆石子,每次选2堆石子合并。第2行有n个整数, 分别表示每堆石子的个数(每堆石子的取值范围为[1,1000]) ...原创 2020-03-11 19:22:12 · 2596 阅读 · 1 评论 -
淘金
题目描述在一片n*m的土地上,每一块1*1的区域里都有一定数量的金子。这一天,你到这里来淘金,然而当地人告诉你,如果你挖了某一区域的金子,上一行,下一行,左边,右边的金子你都不能被允许挖了。那么问题来了:你最多能淘金多少?输入对于每组数据,第一行两个数n,m,表示土地的长和宽(1<=n,m<=200)接下来n行,每行m个数,表示每个区域的金...原创 2020-03-10 18:13:51 · 496 阅读 · 3 评论 -
数字三角形问题
动态规划:#include<iostream>#include<fstream>using namespace std;int main(){ int n; int a[101][101] = {0}, max[101][101] = {0}; ifstream input("input.txt"); ofstream output("output....原创 2019-01-15 17:16:18 · 261 阅读 · 0 评论 -
矩阵链连乘问题
给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘 的,i=1,2...,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序 计算矩阵连乘积需要的数乘次数最少。输入数据:共m+1行;第一行为测试数据的组数m;以后每行n+1个正 整数,表示n个矩阵的行列值。输出:最少次数及连乘的计算次序。 样例输入:15,10,4,6,10,2样例输出:348...原创 2019-01-15 16:15:53 · 990 阅读 · 2 评论