dp
文章平均质量分 50
@Freey
这个作者很懒,什么都没留下…
展开
-
lc403.青蛙过河
问题重述一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个单位。原创 2021-06-15 22:27:47 · 95 阅读 · 0 评论 -
动态规划经典例题
恰好 和 不超过切割次数不超过k次和恰好切割k次的区别仅仅在于dp[i][j],j>=i时的定义不同,一个是无效值,一个是有效值(有点像背包要求装满或不要求转满时的最优解)所以装满和不要求装满,恰好k次和不超过k次的 主要递推式其实是一样的,区别只在于初始化时,对相关变量的赋值不同如果是恰好切割k次,则对于j>=i,即长度为i的钢管一定切不了大于长度i的j次,所以它是一个无效解,且因为要求价值最大,所以赋值无效值为-inf如果是切割次数不超过k次,则对于j>=i,即长度为i的钢管原创 2021-06-14 21:37:54 · 803 阅读 · 0 评论 -
凑零钱+最小字典序(逆序dp)
问题重述思路将零钱从大到小排序,先选择大的再选择小的代码#include<iostream>#include<vector>#include<algorithm>using namespace std;const int N = 10001;int dp[N];int v[N];bool choice[N][N];int cmp(int a, int b) { return a > b;}int main() { i原创 2021-05-26 20:57:52 · 78 阅读 · 0 评论 -
最长有效括号
问题重述给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。思路代码class Solution {public: int longestValidParentheses(string s) { int maxans = 0, n = s.length(); vector<int> dp(n, 0); for (int i = 1; i < n; i++) {原创 2021-05-24 19:31:34 · 45 阅读 · 0 评论 -
至多删三个字符
问题重述给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?思路关键在于怎么去重!仍考虑每一个字符位置删还是不删。设dp[i][j]表示前i个字符删去j个字符获得的不同字符个数若第i个字符删了,则前i-1个字符删去j个字符dp[i-1][j-1]一定是不同的,因为这是之前已经算过的了若第i个字符不删,则就要小心了!!!!因为如果不删,相当于选一个前缀加上第i个字符组成新的字符串,若之前有一个和第i个字符相等的字符a=s[i],并且a和s[i]共原创 2021-05-23 23:25:47 · 503 阅读 · 1 评论 -
青蛙过桥 (逆序dp字典序)
问题重述一座长度为n的桥,起点的一端坐标为0,且在整数坐标i处有a[i]个石头【0<=a[i]<=4】, 一只青蛙从坐标0处开始起跳,一步可以跳的距离为1或2或3【即每一步都会落在整数点处】, 青蛙落在i处会踩着该点的所有石头,求青蛙跳出这座桥最少踩多少个石头?并且输出依次跳 过的坐标点路线,如果存在多种路线,输出字典序最小的那一条。思路正序dp无法输出字典序代码#include<iostream>#include<string.h>#include<原创 2021-05-23 14:17:43 · 448 阅读 · 4 评论 -
Apple Catching.(POJ-2385)
问题重述奶牛爱吃苹果是鲜为人知的事实。FJ在他的田地里有两棵苹果树(编号为1和2)。Bessie不会爬树,所以她必须等着苹果掉下来。然而,她必须在空中接住它们,因为苹果落地时碰伤了(谁也不想吃碰伤了的苹果)。Bessie吃得很快,吃的时间可以忽略不计。 每分钟,两棵苹果树中的一棵会掉落一个苹果。Bessie做过很多练习,只要她站在一棵有苹果落下的树下,就能接住一个苹果。Bessie可以很快地在两棵树之间行走,时间忽略不计。她可以随时站在一棵树下。此外,奶牛没有得到大量的锻炼,所以她不愿意在树间来回地来回行原创 2021-05-10 21:50:40 · 65 阅读 · 0 评论 -
lc740. 删除并获得点数(打家劫舍变题)
问题重述给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。思路关键在于将nums数组转换成0->max的房子,每个房子里存的是nums[i]*count[i]的金钱(因为选了nums[i]则所有nums[i]-1和nums[i]+1全都被删除了,所以一个一个删nu原创 2021-05-05 23:04:02 · 67 阅读 · 0 评论 -
lc1473.粉刷房子III
问题重述思路代码#include <vector>using namespace std;class Solution {public: const int INF=INT_MAX/2; int minCost(vector<int>& houses, vector<vector<int>>& cost, int m, int n, int target) { for(int& c:原创 2021-05-04 15:21:57 · 76 阅读 · 0 评论 -
动态规划
1.钢管问题长为n的钢管如何截取获得的价值最大,p[i]为截取为i长度的钢管价值dp:dp[i]=max{p[j]+dp[i-len[j]]} (0<=len[j]<=i,0<=j<=n)先遍历背包容量再每次遍历j找第一次截取时的位置+剩下钢管的最大价值,有顺序{1,2,3},{3,1,2}算两种不同的方案dp[i][j]=max(dp[i-1][j],dp[i-1][j-len[i]]+p[i])先遍历物品个数变成背包问题,每次装或是不装第i个物品并且只考虑前i个.原创 2021-04-26 18:43:28 · 54 阅读 · 0 评论 -
lc377.组合总和
问题重述给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例:输入: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)请注意,顺序不同的序列被视作不同的组合。思路代码My 没有排列的简原创 2021-04-24 23:35:00 · 83 阅读 · 0 评论 -
lc386.最大整除子集
问题重述给你一个由 无重复正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:answer[i] % answer[j] == 0 ,或answer[j] % answer[i] == 0如果存在多个有效解子集,返回其中任何一个均可。思路dp[i]表示nums前i个数字以nums[i]为结尾的最长整除子集,类似于最长递增子序列设的nums前i个数字中以nums[i]为结尾的最长递增子序列原创 2021-04-23 20:10:51 · 59 阅读 · 0 评论 -
lc87.扰乱字符串(dp)
问题重述使用下面描述的算法可以扰乱字符串 s 得到字符串 t :1.如果字符串的长度为 1 ,算法停止2.如果字符串的长度 > 1 ,执行下述步骤:在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。在 x 和 y 这两个子字符串上继续原创 2021-04-16 23:14:40 · 88 阅读 · 0 评论 -
lc213.打家劫舍2
问题你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。思路原创 2021-04-15 20:38:46 · 107 阅读 · 0 评论 -
lc264.丑数 II
from numpy import *def fun(x): x1=x[0] x2=x[1] return 60-10*x1-4*x2+x1*x1+x2*x2-x1*x2#dx1=-10+2*x1-x2,dx2=-4+2*x2-x1#所以雅可比矩阵如下#Jf=grad=[-10+2*x1-x2;-4+2*x2-x1]#同理hessian矩阵如下#[2,-1;-1,2]#通过计算其逆矩阵为#nh=[2/3 1/3;1/3 2/3]#即nh=[[0.6666,0.333原创 2021-04-12 00:02:39 · 58 阅读 · 0 评论 -
DP
滚动数组1.如果是左上推右下则为了防止这一层的dp覆盖掉上一层的dp必须逆着遍历eg.f[i][j]=f[i-1][j-len[i]]->dp[j]=dp[j-len[i]] (j:1->n)原创 2021-04-04 16:10:04 · 212 阅读 · 0 评论 -
九峰与子序列(字符串hash+dp)
问题重述添加链接描述学会字符串哈希后,动态规划选手九峰想要出一道解法为字符串哈希题,于是wcy给他口胡了一道题,却把九峰难倒了,你能帮他解决这个问题吗?给定长度为n的字符串序列a和字符串k,询问a有多少子序列拼接起来等于k。输入样例5 abcbaab c abc ba abcba输出3拼接后等于abcba的子序列有三种:[1,2,4],[3,4],[5]#include <stdio.h>#include <vector>#include <iostre原创 2021-04-04 14:12:47 · 87 阅读 · 0 评论