动态规划
文章平均质量分 71
动态规划
陌上花开 ~
越努力,越幸运(研究生在读)
展开
-
P1131 [ZJOI2007] 时态同步(树形dp)
题目:P1131 [ZJOI2007] 时态同步思路:根据题意,我们发现它的边数正好是顶点数减一,然后整个图又是联通的,所以说它必然会形成一棵树,贪心地想,对于我们调整的树枝,其下叶子节点距离根节点的距离都会增加,所以,调整越靠根节点的树枝调整的代价越少,所以我们可以先找到最深的叶子节点,再从最小的子树开始,把所有子节点调整到同一深度,再调整子树上面的树枝,这个过程就是回溯,树形dp即可代码:#include <bits/stdc++.h>#define closeSync ios:原创 2022-01-08 18:49:23 · 440 阅读 · 0 评论 -
数学题(dfs or dp),木木不哭┭┮﹏┭┮(dp)
数学题dp思路:首先注意到一个事情:184>10518^4 > 10^5184>105,所以可以使用的数字只有17个,定义dp[x] 表示组成 x 需要使用的最少的四次方数的个数,状态转移方程为:dp[x+i∗i∗i∗i]=min(dp[x+i∗i∗i∗i],dp[x]+1)dp[x+i*i*i*i]=min(dp[x+i*i*i*i],dp[x]+1)dp[x+i∗i∗i∗i]=min(dp[x+i∗i∗i∗i],dp[x]+1)代码:#include <bits/st原创 2021-08-23 02:02:53 · 139 阅读 · 0 评论 -
斜率优化dp入门
推荐2篇博客:斜率优化DP详解-知乎斜率优化-OI Wiki例一:P5785 [SDOI2012]任务安排首先,暴力dp的话,我们可以定义f[i][j]f[i][j]f[i][j]表示前iii个任务分成jjj组的集合,其值为最小费用,我们定义t[i]t[i]t[i]为执行前iii个任务所需的时间前缀和,c[i]c[i]c[i]为执行前iii个任务的费用前缀和,对于如何转移,我们可以枚举最后一组的起点,就是将jjj组分为2部分,前面一部分是j−1j-1j−1组(对应第1−>k1->k1−原创 2021-07-26 18:14:44 · 269 阅读 · 0 评论 -
第12届蓝桥国赛_二进制问题(数位dp)
第一次做数位dp,学完看第12届蓝桥,这不送分题首先上一道刚学的入门数位dp(比蓝桥的都难一些????)题目:求给定区间 [X,Y][X,Y][X,Y] 中满足下列条件的整数个数:这个数恰好等于 KKK 个互不相等的 BBB 的整数次幂之和范围:1≤X≤Y≤231−1,1≤K≤20,2≤B≤101≤X≤Y≤2^{31}−1,1≤K≤20,2≤B≤101≤X≤Y≤231−1,1≤K≤20,2≤B≤10思路:把数字 l,rl , rl,r 分解为BBB进制数 ,每位上的数字存入数组,然后从高位往低位原创 2021-07-14 23:30:32 · 422 阅读 · 0 评论 -
饥饿的牛,单词的划分(基础dp)
饥饿的牛牛在饲料槽前排好了队。饲料槽依次用1到N(1<=N<=2000)编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。约翰提供B个区间的清单。一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。在上面的例子中,1-3和3-4是重叠的;聪明的原创 2021-01-29 21:51:50 · 186 阅读 · 0 评论 -
区间dp(石子合并,BZOJ 1260 涂色)
石子合并思路:代码:#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 310;int n;int s[N];int f[N][N];int main(){ scanf("%d", &n); memset(f,0x3f,sizeof(f)); for (int i = 1; i <=原创 2021-01-27 23:09:45 · 125 阅读 · 0 评论 -
小srf的游戏(单调队列+dp)
【题目描述】srf和qtc在一个规模为 1 × n 的棋盘中下棋。规则是:第一个人可以下在第1 到 m 中的任意一个位置。接下来每一个人可以下在第 i + 1 到 i + m 的任意一个位置,其中i为上一个人下棋的位置。每个格子里有一个数,如果一个人下棋在格子i,会得到a[i]的分值。当不能继续操作时,结束。小srf请你帮他算一下,当他和qtc都采取最优策略时,他的得分减去qtc的得分。【输入】第一行:两个正整数n和m,用空格隔开。第二行:n 个数,表示棋盘上的数字。【输出】两行,每行各原创 2021-01-22 16:08:32 · 450 阅读 · 0 评论 -
树形dp介绍及入门
介绍:树型dp一般先算子树然后进行合并,即:先遍历子树,遍历完之后把子树的值合并给父亲例一:给你一棵n个点的树(1号点为根节点),求以点i为根的子树的大小void dfs(i){ if(i是叶子节点){ f[i]=1;return; } for(k是i的儿子){ dfs(k); f[i]+=f[k]; } f[i]+=1;}f[i]:以点i为根的子树的点的个数f[i] = 1+Σf[k](k是i的儿子)例原创 2020-08-15 19:05:55 · 849 阅读 · 0 评论 -
状压dp入门(含例题)
介绍:位运算:去掉最后一位 : x >> 1在最后加一个0 :x << 1… … (更多操作自己学吧)例一:[SCOI2005]互不侵犯KING分析:f[i][j][k]f[i][j][k]f[i][j][k]表示第i行的状态为k且已经放了j个国王的方案数f[i][j][k]+=f[i−1][j−num[k]][p]f[i][j][k] += f[i - 1][j - num[k]][p]f[i][j][k]+=f[i−1][j−num[k]][p]((k &am原创 2020-08-15 16:22:07 · 485 阅读 · 0 评论 -
入门dp(滑雪, 串)
problem: P1434 [SHOI2002]滑雪solution:dp[i][j]=max{dp[i±1][j±1],a[i±1][j±1]<a[i][j]}dp\left[ i\right] \left[ j\right] =\max \left\{ dp\left[ i\pm 1\right] \left[ j\pm 1\right] ,a\left[ i\pm 1\right] \left[ j\pm 1\right] <a\left[ i\right] \left[ j\r原创 2020-06-27 10:43:47 · 187 阅读 · 0 评论 -
取数游戏2(区间dp)
取数游戏2题目描述给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。输入描述:第一行一个数T,表示有T组数据。对于每组数据,第一行一个整数n,接下来两行分别给出A数列与B数列。输出描述:每一组数据输出一行,最大的∑vi。思路:此题逆向思维,时光倒流,从最后一次取数往前递推到第一次取数。因为第一次取数的位置一定为最左或最右,那么我们只需要找到最左或最右两种情况里面较大的原创 2020-06-17 14:33:47 · 674 阅读 · 0 评论 -
入门dp状态转移分析
斐波那契(Fibonacci)数列:F[n]=F[n-1]+F[n-2] (n>=3,F[1]=1,F[2]=1)#define fo(i,a,b) for(int i=a;i<b;i++)int Fi[20];int F(int n){ if(n==0||n==1||n==2)return (Fi[n]=1); if(Fi[n]!=0) return Fi[n]; return (Fi[n]=F(n-1)+F(n-2));}int main(){ c原创 2020-06-10 14:35:55 · 431 阅读 · 0 评论