
动态规划
只会写臭虫
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode1025. 除数博弈
解法一:dp,仔细想易知dp[i]的结果是由dp[1]到dp[i-1]的结果来决定的,即如果dp[i]为true,那么dp[j](0<j<i-1)必然为false,并且i和j满足i%(i-j)==0。代码:class Solution {public: int dp[1005]; bool divisorGame(int N) { for(int i=2;i<=N;i++){ for(int j=i-1;j>0;j--.原创 2020-08-19 10:55:29 · 357 阅读 · 0 评论 -
最优编辑(牛客网,动态规划)
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。测试样例:“abc”,3,“adc”,3,5,3,100返回:8思路:d...原创 2019-08-17 16:05:18 · 357 阅读 · 0 评论 -
字符串交错组成(牛客网,动态规划)
对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。测试样例:“ABC”,3,“12C”,3,“A12BCC”,6返回: true思路: 设dp[i][j]为...原创 2019-08-17 15:42:22 · 729 阅读 · 0 评论 -
哈深夏令营机试题1:n个色子的点数之和为m的概率计算
实际就是求n个色字点数之和为m的组合数。动态规划:转移方程:dp[i][j]=dp[i-1][j-6] + dp[i-1][j-5] +dp[i-1][j-4]+dp[i - 1][j - 3] +dp[i-1][j-2] +dp[i-1][j-1]边界条件是:dp[0][0]=1;代码:#include<iostream>#include<cstdio>...原创 2019-07-18 00:11:23 · 1061 阅读 · 1 评论 -
LeetCode 309. 最佳买卖股票时机含冷冻期
代码中有注释,需要注意的一点是dp[10000][3]定义的是第i天结束后的状态。用0表示持有股票,1表示不持有,2表示冷冻期代码:class Solution {public: int dp[10000][3]; //dp定义了第i天结束后的状态,0代表不持有,1代表持有,2代表是冷冻期 int maxProfit(vector<int>& price...原创 2019-06-30 20:12:03 · 156 阅读 · 0 评论 -
LeetCode 264 丑数
我的解法是,一个数整除2、3、5后得到的数还是丑数的话,那么这个数一定是丑数,但是果不其然的超时了。。。class Solution { //超时public: int f[1000000]; //表示以i为下标的数是否是丑数 int d[3]={2,3,5}; int nthUglyNumber(int n) { if(n==1) ...原创 2019-06-30 14:40:38 · 127 阅读 · 0 评论 -
P1880 [NOI1995]石子合并(区间dp)
题目描述在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.输入格式:数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.输出格式:输出共2行,第1行为最小得分,第2行为最大得分.输...原创 2019-06-08 18:16:28 · 293 阅读 · 0 评论 -
洛谷 P1736 创意吃鱼法(二维动态规划)
输入样例#1:4 60 1 0 1 0 00 0 1 0 1 01 1 0 0 0 10 1 1 0 1 0输出样例#1:3这题与LeetCode221. 最大正方形很相似,但是这道题在目标转移方程上dp[i][j]不是取dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]中的最小值+1。而是取dp[i-1][j-1]、s1[i-1][j]、s2[i][j-1]中的...原创 2019-06-27 14:47:33 · 216 阅读 · 0 评论 -
LeetCode 368. 最大整除子集
这道题和找最长子序列有点像排序动态规划找到最长的整除子集,但是要记录前一个数位置举个例子 [1,2,3]我们用dp[i]记录到i最长的整除子集长度,用pre[i]记录到i前面一个数的位置class Solution {public: int dp[1000]; int pre[1000]; int maxi=0; int maxlen=1; v...原创 2019-07-02 15:27:18 · 248 阅读 · 0 评论 -
LeetCode 343. 整数拆分
设dp[i][j]表示i划分为j个数的最大乘积。状态转移方程:dp[i][j]=max(dp[i-k][j-1]*k) 1=<k<=i-j+1这里说下k的上界,因为只有i-k>=j-1,这样的状态才是合法的,即我们所求的dp[i][j],i应该大于等于j。边界条件:dp[i][1]=i。代码:class Solution {public: int dp[...原创 2019-07-02 13:33:35 · 157 阅读 · 0 评论 -
LeetCode 96. 不同的二叉搜索树(动态规划)
一个长度为n的序列组成的二叉搜索树总数等于以每个数字为根节点形成的搜索树的集合之和,而对于每个数字为根节点所形成的搜索树之和=左子树形成的集合个数*右子树形成的集合个数。而对于右子树形成的集合个数,若右子树序列长度为len,则就等于1到len形成的搜索树集合的个数,因为序列是递增。(举个例子,即1到5与6到10形成的搜索树个数相当)。所以g[n]为长度为n的序列形成的搜索树个数。代码如下:cl...原创 2019-06-22 13:17:22 · 192 阅读 · 0 评论 -
洛谷P1140 相似基因(动态规划)
思路:dp[i][j]为当长度为i和长度为j的串匹配成功时的基因相似度的最大值,注意,当基因相似度取得最大值时两个串的最后一位可能不是字母。以dp[1][1]为例子,可能会有三种匹配情况:①-A G-②A- -G③A G所以状态方程为:代码是抄添加链接描述这个的。#include<io...原创 2019-06-11 23:34:46 · 427 阅读 · 0 评论 -
洛谷P1040 加分二叉树(区间DP例子)
转自:洛谷P1040题解首先,我们要做的就是设计状态,其实就是设计dp数组的含义,它要满足无后效性。关注这个 左子树*右子树+根 我只要知道左子树分数和右子树分数和根的分数(已给出),不就可以了吗?管他子树长什么样!所以,我们fff数组存的就是最大分数,怎么存呢?我们发现:子树是一个或多个节点的集合。那么我们可不可以开一个f[i][j]来表示节点i到节点j成树的最大加分呢?可以先保留这个...转载 2019-05-20 15:43:25 · 287 阅读 · 0 评论