![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 56
宝宝睡醒了
这个作者很懒,什么都没留下…
展开
-
动态规划之六:数位dp(未完)
数位dp要求区间[l,r]之间符合某种性质的个数时,用f[k]表示0~k之间满足某种性质的个数,那么区间[l,r]即可表示为f[r] - f[l - 1]。例题一求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:17=24+20,18=24+21,20=24+22输入格式第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。输出格式只包含一个整数,表示原创 2021-01-30 17:48:55 · 146 阅读 · 0 评论 -
动态规划之五 :区间dp
区间dp合并石子设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合并 1,2堆,代价为9,得到9 2 ,再合并得到11,总代价为4+9+11=24;如果第二步是先合并2,3堆,则代原创 2021-01-29 21:56:57 · 140 阅读 · 0 评论 -
动态规划之四 状压dp
状压dp棋盘式(八个方向限制)给出一个n*n型的方格棋盘。一个棋子放在其中一个格子里,那么他的8个方向都不能放棋子,限制最多摆放的棋子个数为m,问最多有多少种放法。可以用一个三维数组来表示一个状态,表示所有前i行,已经摆了j个棋子,并且第i行摆放的状态是s的所有方案。判断约束条件,一行内不能有两个棋子相邻,第i - 1行和第i行不能相互攻击到。即:(a & b) = 0, (a | b)不能有两个相邻的1#include <bits/stdc++.h>using names原创 2021-01-28 17:20:37 · 141 阅读 · 0 评论 -
状态机模型
状态机初次听到这个名字以为是多么高大上的难的东西,其实就是把一个物品或者一个活动分成不同的状态,这几个状态可以相互转换。模型一:挑数字有一串数字,你要从中挑几个数字,让其总和最大,但是不能连续挑数字。比如 1 2 3 4 5,如果挑了1,那么不能挑2,可以挑3或者是4。且数列是无序的。1.首先思考可以分成什么样的状态。2.然后发现状态可分为每个数字挑或者不挑。那么用一个二维数组来表示状态,f[i][0]和f[i][1],0代表不挑选,1代表挑选。3.那么这两种状态是如何转化的呢?首先思考一个问题原创 2021-01-27 22:51:42 · 184 阅读 · 0 评论 -
动态规划之三 计数dp/数位统计dp
计数类dp整数划分:给出1个数n,使它划分成a1,a2,a3,…,an的形式。其中a1≥a2≥a3≥…≥an。方法一:完全背包用其中有k个i的组合方式,把这k个i去掉,组成总和为j - k * i。可以推出状态方程为:f[i][j] = f[i - 1][j] + f[i - 1][j - i] + … + f[i - 1][j - k * i];f[i][j - i] = f[i - 1][j - i] + … + f[i - 1][j - k * i];得 f[i原创 2021-01-18 21:21:24 · 272 阅读 · 0 评论 -
动态规划之二:线性dp
一、线性dp(1)数字三角形找到从上到下的最大路径,每次有两种情况,从左上将最大值传下来,从右上将最大值传下来。f[i][j] = max(f[i - 1][j - 1] + a[i][j], f[i - 1][j] + a[i][j]);(2)最长上升子序列for(int i = 1; i <= n; i ++){ f[i] = 1; for(int j = 1; j < i; j ++) { if(a[j] < a[i])原创 2021-01-18 10:45:43 · 149 阅读 · 2 评论 -
动态规划之一:背包问题
01背包给出n个物品,容量是m的背包。每个物品有两个属性,vi是价值,wi是重量,每件物品只能用一次。int main(){ int v[110], w[110]; int f[110]; int n, m; cin >> n >> m; for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i]; for(int i = 1; i <= n; i原创 2021-01-16 00:43:38 · 73 阅读 · 0 评论