动态规划
Huglight
这个作者很懒,什么都没留下…
展开
-
洛谷P1280 尼克的任务 线性DP
题意:给定工作时间N,和K个任务的起始时间P和持续时间T,从第1分钟开始工作,某一时刻若有多个工作则任选一个工作,若只有一个工作则必须要选那个来做,求出能够得到的最多的空闲时间思路:因为时间只能是递增的,所以可以考虑按时间倒序来做,若某一时刻没有任务,则dp[i]=dp[i+1]+1,若有任务,则dp[i]=max(dp[i+Ti]),Ti为起始时刻为i的所有持续时间#include<b...原创 2020-01-14 18:14:41 · 128 阅读 · 0 评论 -
洛谷P1616 疯狂的采药 基础DP
题意:给T时间和M种草药,每种草药给出采摘用时及价值,每种都可以无限采摘,求出在给定时间可以得到的最多价值思路:背包问题,用DP思想很容易想到O(T²)的方法,转移方程dp[i]=max(dp[i],dp[i-j]+dp[j]),就是用小于当前价值的所有时间求出当前时间的最大价值#include<iostream>#include<cstdio>#include&l...原创 2020-01-10 21:55:11 · 209 阅读 · 1 评论 -
LeetCode 264.丑数 II DP
题意:给一个整数n,求出第n个丑数,丑数即为只包含质因数2,3,5的数思路:把质因数分别为2,3,5的丑数看成3个子数组,把整个dp数组看成3个子数组的组合,取每个子数组的索引L1,L2,L3,则第k个丑数即为min(dp[L1]*2,dp[L2]*3,dp[L3]*5),若当前丑数大于某个子数组索引上的值则更新索引值,如此可求出所有n个丑数class Solution { publi...原创 2019-12-26 23:16:52 · 121 阅读 · 0 评论 -
HDU1069 Monkey and Banana DP
题意:给你一些不同的方块,每种方块可以用无限个,当上一方块的底面长宽都小于下一方块的底面时两方块可以叠在一起,求这些方块叠起来的最高高度思路:由于方块可以翻转,故底面有六种情况,每种方块把六种情况都做考虑,取dp[i]为第i个方块为底的时最大高度,则dp[i]=block[i].z+max(dp[j]),0<j<i,即当前最大高度等于当前方块高度加上可以放在i上面的最大高度,求出每个...原创 2019-07-19 12:28:03 · 111 阅读 · 0 评论 -
HDU 1074 Doing Homework 状压DP
题意:给定n个任务,每个任务有deadline和完成用时,若未能在deadline之前完成则须扣分,扣的分数等于延迟的天数,求完成所有任务扣分最少的方案思路:对于完成的特定任务,其用时是固定不变的,但扣的分数取决于完成任务的顺序,故将当前完成了哪几项任务压缩到一个状态i里,取状态k为未完成当前任务j的状态,则k=i-(1<<j),保存下完成当前所有任务总用时,用DP枚举状态求每个状态...转载 2019-07-24 16:01:21 · 100 阅读 · 0 评论 -
Codeforces 1178B WOW Factor
题意:给一个含v和o的字符串,两个连续的v可以组成一个w,求该字符串的子串中可以组成wow的子串有多少个思路:从左到右和从右到左统计w出现的次数,对每一个o,可以组成wow的种数等于左边w数乘以右边w数#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6+5;...转载 2019-07-21 09:53:18 · 226 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping! DP
题意:给一串序列,求所有递增子串中最大子串和思路:基础DP,最大递增子串加一个条件#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int maxn = 1005;const int inf = 0x3...原创 2019-08-09 11:28:36 · 78 阅读 · 0 评论 -
Codeforces 1207C. Gas Pipeline DP
题意:给一串01序列代表道路,1代表有车通过,需要在路上设管道,管道由柱子驾着,在1上的管道高度必须为2,以保证车可以通过,在管道上升或者下降时多占1单位长度,分别给出架设单位管道和柱子单位长度的费用,求出最小总架设费用思路:设置dp[i][0]表示左边柱子高度为1,dp[i][1]表示左边柱子高度为2,可以看出管道上升或者下降都是在0处,故可在0处判断是否上升或者下降;在1处则直接加上当前费用...原创 2019-08-23 20:51:48 · 267 阅读 · 0 评论 -
POJ 2342 Anniversary party 树形DP 独立集
题意:给一棵树,每个节点有一个权值,求树的独立集中最大权值思路:独立集表示为图中两点之间没有边相连的点集,在树上即选了该点就不能选该点的父亲。取dp[i][0]表示不选该点,i的子树的独立集的最大权值,dp[i][1]表示选了该点,i的子树的独立集的最大权值,则dp[i][0] = dp[i][0] + max(dp[j][0], dp[j][1]),表示不选该点时,选该点子节点和不选该点子节点...原创 2019-08-11 11:16:08 · 134 阅读 · 0 评论 -
POJ 1463 Strategic game 最小点覆盖 树形DP
题意:给定一棵树,求树的最小点覆盖(覆盖所有边的最少点数)思路:在最小点覆盖中,对于每条边,至少有一个点属于标记集合里。每个点设置两个状态,dp[i][0]表示不选该点时其子树的最小点覆盖数,dp[i][1]表示选了该点子树的最小点覆盖数,则dp[i][0] = dp[i][0] + dp[j][1]表示若该点不选,则其子节点必选,dp[i][1] = dp[i][1] + min(dp[j][...原创 2019-08-11 16:17:00 · 203 阅读 · 0 评论 -
洛谷 P1880 石子合并 区间DP
题意:有n堆石子,相邻石子堆可以合并为一堆,合并分数等于合并之后石子堆大小,求所有石子合并为一堆后最大得分和最小得分思路:取dp[i][j]为区间[i, j]内合并石子最小分数,则dp[i][j] = min(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]),i≤k<j,类似分治递增区间间隔,表示每次只取相邻的两堆合并,注意序列为环,需要考虑环的问题#includ...原创 2019-08-11 17:17:51 · 134 阅读 · 0 评论 -
Codeforces 55D. Beautiful numbers 数位DP 离散化
题意:定义一个数为beautiful number,则这个数可以被其每位数整除,给出左右边界l和r,求出边界内存在的beautiful number个数思路:数据量太大(9*10^18),故先要离散化,之后用数位DP对每位进行枚举,求出当前数位漂亮数字个数,递归求出答案。lcm表示a,b的最小公倍数,用来求各位数的最小公倍数,len表示枚举边界,即数位长度,lim表示是否最高位,用来求枚举上界...转载 2019-09-10 21:03:56 · 113 阅读 · 0 评论 -
HDU 2089 不要62 数位DP
题意:一个数为好数,则这个数各位里没有连续的62且没有4,给定区间l和r,求区间内好数的个数思路:数位DP记录上一位数字,若上一位为6当前位为2,或者当前位为4则跳过,用sta标记是因为前导为6时可能下一位是2,则结果就会和前导不是6的结果不同,而4和2则不用单独做标记,因为在判断时就已经算进去了#include<iostream>#include<cstdio>#...原创 2019-09-10 21:28:43 · 114 阅读 · 0 评论 -
HDU 3555 Bomb 数位DP
题意:给一个炸弹,当计时器当前值中包含连续的49时炸弹威力加1,给出计时器初始值,求出炸弹总威力思路:数位DP,记录上一位是否为4,若满足条件且当前位为9,直接加上当前长度的十的len次方个数,比如500内满足十位数4个位数9的有49,149,249,349,449共5个,百位数为4十位数为9的有490,491,…,499共10个。若不满足则继续递归#include<iostream&g...原创 2019-09-10 22:59:29 · 120 阅读 · 0 评论 -
Codeforces 1209E1. Rotate Columns (easy version) 状压DP
题意:给定一个m行n列的矩阵,每列可以进行旋转操作,即列上的元素往上或往下依次循环移动,可以在任意行进行任意次操作,求出操作过后每行的最大元素之和的最大值思路:可以将每列压缩成一个状态,来存储是否旋转且旋转过多少次,对于每个状态枚举其所有子状态,依次进行旋转操作,求出旋转过后能取到的最大值,再判断是否需要进行旋转#include<bits/stdc++.h>using names...原创 2019-09-18 15:54:50 · 322 阅读 · 0 评论 -
Codeforces 1221D. Make The Fence Great Again DP
题意:给定n个栅栏,每个栅栏高度为a[i],可以对栅栏进行修理并使其高度加1,修理费用为b[i],为了使相邻的栅栏高度不同,求最小修理费用思路:设置状态dp[i][j]为第i个栅栏,修理高度为j,j可以是0,1,2(若相邻两栅栏高度差为1则最少要修2次),枚举i和j,还有i-1个栅栏的修理高度k,若修理过后相邻栅栏高度不同,则进行状态转移,求出最后一个栅栏不同修理高度中的最小修理费用即可#in...原创 2019-09-20 19:00:56 · 147 阅读 · 1 评论 -
Codeforces1195C Basketball Exercise DP
题意:有2*n个学生,排成两行,每行n个学生,需要选出学生组成球队,选的学生索引单调递增,且不能选相邻学生(可以选另一行索引相邻),求选的学生身高和最大值思路:取dp[0][i]为索引为i之前两列的最大身高和,dp[1][i]为i之前第一列身高最大和,dp[2][i]为第二列身高最大和,每次选到当前索引的时候或者选另一列的前一个索引的学生,或者选之前同列的不相邻的学生,由此可得状态转移方程dp...原创 2019-07-18 21:23:27 · 200 阅读 · 0 评论 -
XDU暑训2019 Day10 洛谷P1060 01背包
题意:每个物品有价格和重要度,求不超过给定金钱的情况下选的物品重要度和价格乘积最大思路:每个物品分为选或者不选,求出两者之间乘积最大值即可#include<algorithm>#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include&...原创 2019-07-12 11:18:50 · 85 阅读 · 0 评论 -
Uva10003 Cutting Sticks
有一根长度为L的棍子,还有n个切割点的位置,求在切割点处将棍子切割成n+1部分的最小总切割费用,每次切割费用等于被切割木棍长度。#include<bits/stdc++.h>using namespace std;const int INF = 10000;int a[55], dp[1003][1003], n, l; int d(int i, int j) { if ...原创 2019-05-05 16:16:29 · 105 阅读 · 0 评论 -
LeetCode 1049 背包问题 动态规划
题目是在一堆石头里选两个石头碰撞,小的粉碎大的重量减去小的重量,求所有石头碰撞后的最小重量看成是两堆石头,用动态规划来求,当其中一堆重量最接近sum/2时碰撞后消耗的重量最多,剩下重量最少,即求sum/2的背包里最多能装多少重量的物品public int lastStoneWeightII(int[] stones) { int sum = 0; int[] d...原创 2019-05-29 13:27:24 · 1099 阅读 · 0 评论 -
CodeforcesB. Ilya and Queries 动态规划
题意是找出一个区间里子串中c[i] == c[i+1]个数每次查询都暴搜,Java跟C都超时import java.util.Arrays;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in...原创 2019-06-18 23:37:14 · 106 阅读 · 0 评论 -
LeetCode 53 最大子序列和 动态规划
第一道完全自己做的动态规划题,哭了,虽然挺简单的public int maxSubArray(int[] nums) { int[] dp = new int[nums.length+1]; for (int i = 0; i < nums.length; i++) { dp[i] = nums[i]; } ...原创 2019-06-03 20:20:29 · 195 阅读 · 0 评论 -
Codeforces 580A. Kefa and First Steps 动态规划
C题现在真的做不来,还是先从AB做起,多刷几题再说把主要就是用空间换时间,dp[i]表示i之前的最后一个递增序列长度import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (i...原创 2019-06-15 22:00:19 · 136 阅读 · 0 评论 -
Codeforces C - George and Job 动态规划
题目:求一个序列中k个长度为m的不重复子序列相加的最大和选取dp[i][j]表示在[j,n]范围内选了i个子序列的最大和,转移方程为dp[i][j]=max(dp[i-1][j+m] + sum[j+m-1] - sum[j-1], dp[i][j+1]),表示是否选[j, j+m-1]这段作为子序列之一import java.util.Scanner;public class Main ...原创 2019-06-11 00:00:36 · 133 阅读 · 0 评论 -
LeetCode 62 不同路径 动态规划
思路:因为只能往下或者往右走,所以第一列或者第一行每个点都只有一条路径可以到达,其他位置可以从上面或者左边到达,所以等于上面的路径加上左边路径和public int uniquePaths(int m, int n) { int[][] dp = new int[m+1][n+1]; for (int i = 0; i < m; i++) ...原创 2019-06-04 23:38:44 · 145 阅读 · 0 评论 -
LeetCode 63 不同路径Ⅱ 动态规划
第一行或者第一列中如果有障碍就无法到达该列或该行下一位置,所以后面都为0。其他位置如果左边或者上面有障碍,就无法从该处到达。可能在大佬看来这题比较简单,但是独立写出来的感觉还是挺舒服的原创 2019-06-05 00:03:46 · 113 阅读 · 0 评论 -
XDU暑训2019 Day2 母牛故事
题意:一头母牛每年生一头小母牛,每个小母牛从第四年开始每年生一头小母牛,求第n年母牛数量思路:前3年只有一头母牛再生,后面就可以用递推,每年母牛数等于去年数量加上所有大母牛生的数量,即第i年有i-4头大母牛(i > 4)#include<iostream>#include<cstdio>#include<cstring>using namespa...原创 2019-07-02 18:13:31 · 164 阅读 · 0 评论 -
XDU暑训2019 Day10 洛谷P1164 DP 背包变式
题意:给定金钱m,求正好花完钱时购买菜的方案数思路:取dp[i]为钱为i时的方案数,则dp[0]即没钱时方案数为1,每个菜的方案数可以由选这个菜之前的方案数相加得来,由此得状态方程dp[j] += dp[j-a[i]]#include<bits/stdc++.h>using namespace std;int n, m, a[105], dp[10005];int main(...原创 2019-07-12 17:06:22 · 2197 阅读 · 0 评论 -
XDU暑训2019 Day10 洛谷P1049 DP 背包变式
题意:给一个容量为v的箱子,每个物品有一个对应体积,任选物品装入箱子,求箱子最小剩余容量思路:取dp[i]为容量为i时所选的最大容量,即背包容量为v,价值为每个物品体积,求不超过v选取的最大体积,由于不超过v所以选的最大体积不会超过v,故答案即为v-dp[v]#include<bits/stdc++.h>using namespace std;int n, v, a[35], ...原创 2019-07-12 17:37:50 · 107 阅读 · 0 评论 -
洛谷P1020/HDU 1257 导弹拦截 DP
题意:一套系统能够拦截的导弹不能够超过上一枚导弹的高度,第一枚导弹可以为任意高度。给定一些导弹的高度,求需要这样系统的最少个数,洛谷还需要求出一套系统最多可以拦截多少枚导弹思路:求最少系统个数即高度序列中不上升子串的最大长度,即最长递增子序列,求最多拦截个数即求序列中递减子串的最大长度,可以用动态规划实现,复杂度O(n²)#include<bits/stdc++.h>using ...原创 2019-07-14 16:58:50 · 107 阅读 · 0 评论 -
洛谷P1091 合唱队列 DP
题意:给一个序列,为了使序列为从左到中间、从中间到右分别为递增、递减(中间最大),求从序列中删去的最少元素个数思路:转换一下思路,求删去最少元素即求n-留下最多元素,对于每个中间点i,留下的元素个数等于从左到i求最长递增子序列和从右到i-1求最长递增子序列,两者相加即可得到最长留下长度。首先从左到右求一次,再从右到左求一次,答案即为dp1[i]+dp2[i]-1#include<bits...原创 2019-07-14 20:23:03 · 145 阅读 · 0 评论 -
XDU暑训2019 Day9 POJ 1458 DP
题意:求两字符串的最长公共子序列(LCS)思路:取dp[i][j]为s1的前i个字符和s2的前j个字符的最大公共子序列长度,则当前字符相等时长度为前面的长度加1,不相等则长度为之前的最大长度#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using nam...原创 2019-07-11 11:14:55 · 104 阅读 · 0 评论 -
XDU暑训2019 Day9 POJ 2533 DP
题意:求最长上升子序列长度思路:做了起码三四次了,取dp[i]为i之前递增子序列长度,求这些长度最大值即可#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;const int maxn = 100005;int d...原创 2019-07-11 11:44:15 · 151 阅读 · 0 评论 -
UVa12563 Jin Ge Jin Qu hao
给出n首歌的时间,和时间限制,求出在规定时间内能够唱的最多曲数,还有加上劲歌金曲的总时间测试用例:23 10060 70 803 10030 69 70#include<bits/stdc++.h>using namespace std;const int maxn = 55;int a[maxn], n, t, T, dp[10003];int main(){...原创 2019-05-04 22:21:14 · 108 阅读 · 0 评论