
算法 - 动态规划(dp)
算法 - 动态规划(dp)
Authur_gyc
这个作者很懒,什么都没留下…
展开
-
NC35 最小编辑代价
思路当i字符等于j字符时:dp[i][j] = dp[i-1][j-1]当i字符不等于j字符时:dp[i][j] = min(insert, delete, replace)int insert = dp[i][j-1] + 1; i个编辑成j-1个字符,再插入int delete = dp[i-1][j] + 1; i-1个编辑成j个字母,再删除int replace = dp[i-1][j-1] + 1; i-1个编辑成j-1个字母,再替换代码class Solution {public原创 2021-03-27 20:01:45 · 152 阅读 · 0 评论 -
2020 ICPC 线上模拟赛 E题 Eat Walnuts(区间dp)
E Eat Walnuts思路简单的区间dp,注意边界值不能选,i>j部分应初始化为0(而不是INF)代码#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e2 + 10;const int INF = 5e8 + 10;int a[maxn];int dp[maxn][maxn];int原创 2020-11-01 16:15:16 · 275 阅读 · 0 评论 -
J题 Jigglypuff(思维 + 记忆化搜索)
文章目录题目思路队友敲的代码自己造的样例题目思路路径只要经过两次拆分和两次合并就是YES因为长路径必定是由短路径构成的,将最短路径合并让自己处于尽可能左上的位置,这样是最贪心的,也是最优的。所以找到图中所有的倾斜点对的合并点,再查看右下角矩阵内是否有合并点,以及当前合并点下面和右边是否有合并点,就可以判断当前合并点是否能YES。两种特殊情况一个合并点下,第二个合并点的所有可行解队友敲的代码#include <bits/stdc++.h>#define ls o <原创 2020-05-19 22:50:56 · 734 阅读 · 0 评论 -
Secret of Chocolate Poles (dp)
思路根据题目给出的性质,显然可以用dpdp[i][j] i表示目前高度为i层,j表示白色或者黑色,0为白,1为黑。因为题目要求黑白交错叠,故白的都由黑的转移过来,黑的都由白的转移过来。在层数小于k时有dp[i][0] = dp[i - 1][1]dp[i][1] = dp[i -1][0]当层数大于等于k时dp[i][1]的状态转移方程多了一项dp[i][1] = d[i - 1]...原创 2020-04-28 21:36:52 · 189 阅读 · 0 评论 -
C - Basketball Exercise (dp)
https://codeforces.com/contest/1195/problem/C思路用两个一维dp一个表示第一个数字是取第一行的,一个表示第一个数字是取第二行的。dp[0][i]表示从第一行开始,到第 i 列的最大值。dp[1][i]表示从第二行开始,到第 i 列的最大值。由于同一行不能连续取,所以对于dp[0][i],要么是从dp[1][i - 1]转移过来并且取了当前a[...原创 2020-02-12 14:34:04 · 206 阅读 · 0 评论 -
2020牛客寒假算法基础集训营2 题解
知识点:枚举,贪心,DP,数论,思维,数据结构,哈希A题 做游戏水题#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e7 + 5; int main(){ ll a, b, c; ll x, y, z; cin >>...原创 2020-02-07 12:44:03 · 464 阅读 · 0 评论 -
2020牛客寒假算法基础集训营1 题解
A题 honoka和格点三角形纸上画一画,即可推出公式。这我存在计算重复的,要去重。#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 1e9 + 7;int main(){ ll n, m; scanf("%lld %lld", &...原创 2020-02-04 23:11:54 · 370 阅读 · 0 评论 -
Educational Codeforces Round 80 (Div. 2) D题 Minimax Problem (二分 + 二进制枚举)
题目http://codeforces.com/contest/1288/problem/D题意n个数组,每个数组都有m个数据要你找到这样两个数组ai 和 aj,使得也就是使那个最小值是最大的。思路首先根据题意,我们可以知道目的是要让最小值最大化,二分能够解决该类问题(可见我搜索算法栏目里面的二分总结博客)。这里要注意是我们只能二进制枚举列,而不是二进制枚举行,一开始想的是二分答案然...原创 2020-01-30 10:36:44 · 218 阅读 · 0 评论 -
BZOJ1010 [HNOI2008] 玩具装箱toy (斜率优化dp)
题目Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1…N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充...原创 2020-01-22 02:38:40 · 198 阅读 · 0 评论 -
Educational Codeforces Round 80 (Div. 2) C. Two Arrays ( dp )
题目Educational Codeforces Round 80 (Div. 2) C. Two Arrays思路https://www.cnblogs.com/Herlo/p/12195658.html代码#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = ...原创 2020-01-19 02:59:32 · 322 阅读 · 0 评论 -
Dp优化 斜率优化
参考来源一篇写的很详细很好的博客https://www.cnblogs.com/yangsongyi/p/9630227.html原创 2020-01-18 02:21:49 · 190 阅读 · 0 评论 -
HDU 3507 Print Article(斜率优化DP)
题意有一篇文章,每个字有一个权值,文章中每行的花费为这行上面所有数字之和的平方再加上一个常数m,要求整篇文章的最小花费。思路首先它是个dp题目,我们先把转移方程写出来dp[i]=dp[j]+(sum[i]−sum[j])2+M(对于所有0<j<i)dp[i] = dp[j] + (sum[i] - sum[j])^2 + M (对于所有 0 < j < i )dp...原创 2020-01-18 01:53:36 · 187 阅读 · 0 评论 -
2017 Hongkong区域赛 G题 Optimal Coin Change (背包)
题目给你一个钱数val,还有好多不同面值的钞票,这些钞票的数目无限。要你用这些钞票凑够val,使得所用钞票的数目最少,如果钞票数目最少的答案有多个,则输出尽可能用了小面额钞票的那种方案。思路一个完全背包然后为了使得我们用了尽可能小面额的钞票,我们需要只要在凑钱的时候,尽可能的先用大面值的钞票凑,那么剩下的就是钱数就尽可能小了,也就满足了要求。代码#include <iostre...原创 2019-11-22 16:20:22 · 210 阅读 · 0 评论 -
B题 Maximum Subarrays(动态规划)
https://vjudge.net/contest/342638#problem/B题意给你一个数列,要你找到K个不相交的区间,使得它们的和最大思路这里用动态规划。dp[i][j]表示我选出i个不相交的区间,并且选取了第j个数字的总和的最大值dp[i][j]表示我选出i个不相交的区间,并且选取了第j个数字的总和的最大值dp[i][j]表示我选出i个不相交的区间,并且选取了第j个数字的总...原创 2019-11-13 17:06:36 · 356 阅读 · 0 评论 -
动态规划 区间dp
概念区间dp:在区间上进行动态规划,求解一段区间上的最优解。它是通过合并小区间的最优解进而得出整个大区间上最优解的dp算法。区间dp是线性dp的扩展。在分阶段地划分问题时,它与阶段中元素出现的顺序以及由前一阶段的哪些元素合并而来有很大的关系。性质合并 :即将两个或多个部分进行整合,当然也可以反过来;特征 :能将问题分解为能两两合并的形式;求解 :对整个问题设最优值,枚举合并点,将问题...原创 2019-09-01 19:52:34 · 249 阅读 · 0 评论 -
HDU 2602 (01背包模板题)
思路01背包模板题,就是当前骨头取与不取的抉择问题,选择收益最大的那个即可。需要注意的是,背包的容量要从0开始枚举到v,如果从1开始枚举会WA,可能是数据含有一些骨头,占用的空间为0。(然而这在现实中并不可能)题意只说了给出的数据的上界而没有说下界,这样并不好。如果将二维数组优化为一维数组,注意内层循环的方向发生了改变,变成了从后往前。要改变循环方向的原因是,我们当前状态是来源于上一行状态...原创 2019-08-24 17:05:36 · 196 阅读 · 0 评论 -
专题二 : 01背包 ( HDU 2602 ,UVA 624)
HDU 2602对01背包的理解01背包的关键部分是“取与不取”如下:用两个循环遍历所有情况for(int i=0;i<N;i++) for(int j=0;j<=V;j++) if(j<w[i])//如果背包没位置容纳下目前考虑的物品,则不取 dp[i+1][j]=dp[i][j]; else//如果背包能够容纳下目前考虑的物品 ...原创 2019-03-28 14:27:26 · 193 阅读 · 0 评论 -
动态规划 完全背包
概念完全背包问题是指在背包容量允许的范围内,如何拿取物品来构成总价值最大,每样物品都能够拿多次(如果背包放的下的话)。理解1、完全背包与01背包的不同之处在于:在背包容量允许的范围内,完全背包的物品可以拿取任意多个来构成总价值最大。2、对于当前的物品我们可以看取一个,取两个…直到不能够取当前物品了,取一直取最佳的即可。3、完全背包优化为一维的时候,内层循环要取正向,否则得出的答案会错误,...原创 2019-08-24 23:00:17 · 128 阅读 · 0 评论 -
HDU 2546(贪心+01背包)
HDU 2546http://acm.hdu.edu.cn/showproblem.php?pid=2546思路先贪心以下,然后剩下的再用01背包求解即可。1、如果余额<5,不够买,那么直接输出m即可。2、如果余额>=5,那么先拿出五块钱来买价格最大的菜。然后剩余的钱再用01背包算能花掉的最多的钱。然后结合起来节课代码#include <iostream>...原创 2019-08-25 15:03:35 · 336 阅读 · 0 评论 -
动态规划 多重背包
概念多重背包:理解举例HDU - 2191 多重背包模板题代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 1...原创 2019-08-25 15:04:17 · 276 阅读 · 0 评论 -
算法 记忆化搜索
记忆化搜索 ≈\approx≈ dp理解记忆化搜索其实就是把暴搜过程中,我们搜到的每个状态的答案存储下来。记忆化搜索的过程中没有运用外部变量,答案以返回值的形式存在,而不是以参数的形式存在。在有状态压缩的时候,我们用记忆化搜索可以避免很多的无效状态。大部分记忆化搜索的状态/转移方程与 dp 都一样,时间复杂度/空间复杂度与 不加优化的 dp 完全相同做法一1、把这道题的 dp 状态和...原创 2019-08-22 16:56:18 · 276 阅读 · 0 评论 -
HDU 1171 多重背包二进制分解
题意给你一些东西,每样东西都有它的权值和个数。问你把它分成两个部分,要使两个部分的权值之和的差值最小。问这种情况下的两个权值是多少?思路我们先算出总和。然后把 总和的二分之一 当做背包的容量。然后对所有数字,在这个背包容量下dp即可。我这里用了多重背包的dp,在网上看到许多题解用了01背包来做,也可以,不过花费的时间是用多重背包dp的十倍,如果数据量再大一些些就T啦。代码#in...原创 2019-08-27 19:55:15 · 181 阅读 · 0 评论 -
LightOj 1422(区间dp)
思路先把所有的答案dp[i][j]初始化为最差的解(因为后面要取min),也就是每件衣服都是新买的衣服(最大的花费)。对于dp[i][j]dp[i][j]dp[i][j] 如果是由之前买新衣服来的,则dp[i][j]=dp[i][j−1]+1dp[i][j] = dp[i][j - 1] + 1dp[i][j]=dp[i][j−1]+1然后再考虑在这个区间范围,是否有一天要穿相同的衣服。对...原创 2019-08-29 15:21:11 · 161 阅读 · 0 评论 -
动态规划 数位dp
概念数位dp是一种计数用的dp,它的思考角度是从数字的每一个数位出发的,在每个数字的数位上进行dp(个位、十位、百位……)。适用情况一般就是给定一个闭区间 [L,R][L,R][L,R] 让你求这个区间中满足 某种条件f(i) 的数字的个数。条件 f(i) 一般与数的大小无关,而与数字的组成有关,由于数是按数位进行dp的,所以数字的值大小对复杂度的影响很小。(往往题目给的数字的数值会很大,...原创 2019-08-29 18:15:18 · 304 阅读 · 0 评论 -
CodeForces - 55D (数位dp + 离散化 + 数论)
思路参考来源博客https://www.cnblogs.com/dilthey/p/8542011.html博客https://www.cnblogs.com/neopenx/p/4063647.html原创 2019-08-30 15:42:47 · 418 阅读 · 0 评论 -
HDU - 3652(数位dp)
思路把1看成1,把0看成-1。用cnt记录1与-1的和,根据cnt与0的关系就能知道0的个数是否大于等于1的个数。当后面的数字都是0的时候,依然无法让0的个数大于等于1时,直接跳过。当枚举0的时候,看有没有前导零,如果有前导零,那么0个数不变。如果没有前导0,那么0的个数会改变。代码#include<cstdio>#include<iostream>#in...原创 2019-08-30 19:00:08 · 135 阅读 · 0 评论 -
HDU 3652 B-number(数位DP)
思路dp数组开四维度,分别为pos mod is onepos是表示第pos位mod是模13后的余数is是判断是否已经出现过13one是判断上一位是否是1这里我用这四个条件进行判断,才不会计算重复。代码#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring...原创 2019-08-31 09:27:27 · 166 阅读 · 0 评论 -
Gym - 102267K Birthday Puzzle (状态压缩)(遍历子集的位运算)
参考来源博客:https://blog.youkuaiyun.com/qq_43333395/article/details/96397197#commentBox题目链接http://codeforces.com/gym/102267/problem/K题意给你一个集合,问它的所有子集(不为空)的元素或了之后 的和是多少。理解既然要求所有的子集的异或和,而这里n值又很小,O(2n)不会超时,...原创 2019-07-21 23:56:29 · 530 阅读 · 0 评论