DP
不会JAVA的运营不是好数分
这个作者很懒,什么都没留下…
展开
-
2015 d2t2 P2679 子串
2015 d2t2 P2679 子串题意https://www.luogu.org/problem/P2679简单说:把一个字符串A,截取K个子串,能够拼成B。子串,需要连续。想法线性DP+状态压缩详细的点说:这种问题,首先是两个子串。参考编辑距离。需要有两个状态,i 和 j。代表A串和B串的当前字符。之后需要在往这个基础上,加状态就行了。此时需要加的状态有两个:一个是分段数k一个是当前 i 是否选择。选择则当前字符必须相等。下来开始dp流程:下来来解释一下:状态表示状态表原创 2020-07-06 20:55:17 · 161 阅读 · 1 评论 -
04 P3957 跳房子
04 P3957 跳房子https://www.luogu.com.cn/problem/P3957题意n个格子,d为机器人每次前进的距离,k为需要达到的目标每一次,机器人可从左到右前进d.也可以画金币 g。让机器人变得灵活其中 如果 g <d 。活动范围为: d-g <= x <= d+g如果 g>d。活动范围为 1<= x <= d+g想法dp+二分f(i) 代表走到第i个格子了,最大的分数二分来找到合适的金币数//P3957原创 2020-06-26 20:52:26 · 194 阅读 · 0 评论 -
最长上升子序列 (LIS)
最长上升子序列 (LIS)最长上升子序列解题报告给定一个长度为N的数列(w[N]),求数值严格单调递增的子序列的长度最长是多少。样例输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1 ≤ N ≤ 1000,−1e9 ≤ 数列中的数 ≤ 1e9输入样例:73 1 2 1 8 5 6输出样例:4想法一(动态规划) O(n^2)* 状态表示:f[i]表示从第一个数字开始算,以w[i]结尾的最大的上升序列。(以w[i]原创 2020-06-13 23:04:29 · 206 阅读 · 0 评论 -
P5662 纪念品 - 2019普及T3
P5662 纪念品https://www.luogu.com.cn/problem/P5662题意用m金币在t天内买卖n个纪念品 。求最多得到多少钱n个纪念品在t天内的价格是不一样的。用数组 w[i]/[j]表示同时关键——当天可以买卖纪念品。都是同样的价格。想法完全背包+贪心**当天可以买卖纪念品。都是同样的价格 ** 这个很关键。这样可以把第i买,第j天卖的问题转化 为:则等价于在第 i 天买入,第 i+1 天卖出,第 i+1 天再买入, …, 在第 j 天卖出。因为当天原创 2020-06-12 07:46:11 · 234 阅读 · 0 评论 -
完全背包问题和优化
完全背包问题题意选取的物品无限求价值最大值分析图解难点:状态计算——第i个物品选(0 - k)个。那么k*v【i】 <= 背包剩余空间第i个物品,选k个那么需要加上 k个物品的价值朴素的算法/*f[i - 1][j] 一个都不选 k == 0f[i - 1][j - v[i] * k] + w[i] * k 选1 ~ k个 1 <= k <= s[i]*/#include <iostream>using namespace std;原创 2020-06-02 12:18:53 · 1115 阅读 · 4 评论 -
分组背包原理
分组背包有N种物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法思想这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k]/[v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}使用一维数组的伪代码如下原创 2020-06-02 12:16:53 · 281 阅读 · 2 评论 -
多重背包原理及优化思想
多重背包题意有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本想法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w原创 2020-06-02 12:09:47 · 332 阅读 · 0 评论 -
01背包原理及动态数组优化
01背包问题描述有N件物品和一个容量为V的背包。第i件物品的体积是v[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。这是最基本的背包问题,每个物品最多只能放一次。想法DP分析状态——f【i】【j】从前i个物品中选总体积不超过j的所有选法转移方程f[i][j] = max(f[i][j],f[i-1][j-v[i]]+w[i])朴素代码——二维数组#include <iostream>using原创 2020-06-02 12:06:47 · 248 阅读 · 0 评论 -
区间DP 原理和套路
区间DP题目是有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。分析f[i,j]表示所有所有将第i堆到第j堆石子合并成一堆石子的合并方式枚举【i,j】的长度从 2 - n第i堆到第j堆石子合并成一堆石子的合并方式,一共三步1 第i - k 凑成一堆最小值2 第 k+1 - j 凑成一堆的最小值3 两堆合起来。就是 【i,j】所有数之和。可以用前缀原创 2020-06-02 12:03:59 · 601 阅读 · 0 评论 -
P1352 没有上司的舞会 -树形DP
P1352 没有上司的舞会题意一家公司有n个员工,编号为1~n。他们的关系就像一棵以校长为根的数,父节点就是子节点的直接上司。每个员工都有一个快乐指数。现在要开一个周年庆典,没有员工愿意和直接上司参加舞会,问怎样安排能让快乐值最大,求最大值。数据范围:N≤6000想法DFS+DP,dp[x,1]表示x去,dp[x,0]表示x不去dp[x,1]:=sum(dp[所有子节点,0])+快乐值[x]; //x去了,下属不能去,所以dp[所有子节点,0]dp[x,0]:=sum原创 2020-06-02 11:18:55 · 356 阅读 · 0 评论 -
树形DP一般解题思路
树形DP定义整个题目给出,是一棵树。一般而言:以节点从深到浅(子树从小到大)的顺序作为dp的阶段;dp状态表示中,第一维通常是节点的编号(代表以该节点为根的子树。)大多数时候,采用递归的方式实现树形dp。dp[i]/[j] (i通常是节点的编号),j代表状态(例如是否选择了第i个节点)这个状态j一般有两个状态,0没选,1选了模板没有上司的舞会一家公司有n个员工,编号为1~n。他们的关系就像一棵以校长为根的数,父节点就是子节点的直接上司。每个员工都有一个快乐指数。现在要开一个原创 2020-06-02 11:17:17 · 627 阅读 · 0 评论