![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
Sqwlly
有自己热爱的东西,真好。
展开
-
CF 721C - C. Journey(拓扑排序+DP)
C. Journey(拓扑排序+DP)一点不相关的话:好久没有更新博客了,当我再次看到这些,甚至都想象不到这些都是我写的。嗳,可能这就是命运多舛吧。去年打完最后一场ICPC后,就开始抉择是考研还是继续打下去,但是好像没有人陪我打下去了,ACM一个人真的很难坚持(其实有很多话想说,但是,我现在不想再回忆,这样只会消沉自己的情绪。)。最终,在询问过已经毕业的学长之后,我选择了去考研。今天考研视频网课...原创 2020-02-15 21:06:53 · 548 阅读 · 0 评论 -
POJ 3420 Quad Tiling 状压DP+递推+矩阵快速幂
Quad Tiling题解:首先根据题目数据量来看,肯定是必须有递推公式的了或者滚动数组什么的。因此我们考虑递推情况,对于4⋅n4\cdot n4⋅n,最后一列的放置情况。如果是444个[1⋅2][1\cdot 2][1⋅2]排列,那么dp[n]=dp[n−2]dp[n] = dp[n - 2]dp[n]=dp[n−2]。如果是222个[2⋅1][2\cdot 1][2⋅1]排列,那么d...原创 2018-12-11 00:36:23 · 192 阅读 · 0 评论 -
POJ 3411 Paid Roads (状压DP)
Paid Roads题意:111到nnn的最小花费,aaa到bbb的花费为,如果经过ccc为ppp,否则为rrr。题解:dp[i][j]dp[i][j]dp[i][j]表示以jjj结尾状态为iii时的最小花费,则有dp[i∣1<<a][b]=min(dp[i∣1<<a][b],dp[i][a]+C[ i>&...原创 2018-12-04 00:05:22 · 234 阅读 · 0 评论 -
POJ2836 Rectangular Covering(状压dp)
Rectangular Covering题解:先预处理出所有的矩形吧。然后将每个矩形所涵盖的点也处理出来。最后再dpdpdp。dp[s]dp[s]dp[s]表示矩形集合为sss的时候的最小面积。则有dp[s∣j]=min(dp[s∣j],dp[s]+a[j].area)dp[s|j] = min(dp[s|j],dp[s] + a[j].area)dp[s∣j]=min(dp[s∣j],dp[...原创 2018-11-25 21:24:12 · 194 阅读 · 0 评论 -
POJ3254 Corn Fields(状压dp)
Corn Fields题解:先预处理出所有可行的状态。然后初始第一行,从第二行开始枚举每一行所有可行的状态,对于每种可行状态再枚举与上一行的状态是否冲突。dp[i][j]dp[i][j]dp[i][j]表示第iii行状态为jjj的时候的方法数。则有dp[i][j]=dp[i][j]+dp[i−1][k](state[j]&state[k]==0)dp[i][j] =dp[i][...原创 2018-11-25 20:54:49 · 168 阅读 · 0 评论 -
POJ 2441 Arrange the Bulls(状压dp)
Arrange the Bulls题解:本题可能就考验的是对位运算的掌握叭…dp[s]dp[s]dp[s]表示在状态为sss的情况下满足方案的个数。首先满足第一个球队喜欢的场地,然后枚举场地集合,就有如果iii喜欢jjj并且已有集合sss里还未存在jjj,则dp[s∣j]=dp[s∣j]+dp[s]dp[s | j] = dp[s | j] + dp[s]dp[s∣j]=dp[s∣j]+dp[...原创 2018-11-25 19:32:53 · 202 阅读 · 0 评论 -
洛谷P1018 乘积最大(dp)
P1018 乘积最大题解:dp[i][j]dp[i][j]dp[i][j]表示前iii个数插入jjj个乘号时的最大乘积。那么明显有dp[i][j]=max{dp[p][j−1]⋅num[p,j]}dp[i][j] = max\{dp[p][j - 1] \cdot num[p,j]\}dp[i][j]=max{dp[p][j−1]⋅num[p,j]}。代码import java.util.S...原创 2018-11-19 23:58:09 · 370 阅读 · 0 评论 -
洛谷P1435 回文字串(dp)
P1435 回文字串题解:dp[i][j]dp[i][j]dp[i][j]表示前iii个字符与后jjj个字符构成回文串需要插入的最少字符数。则有{dp[i][j]=dp[i−1][j−1],s[i]==s[n−j+1]dp[i][j]=min(dp[i−1][j],dp[i][j−1])+1,s[i]̸=s[n−j+1]\begin{cases}dp[i][j] = dp[i-1][j-1],...原创 2018-11-19 23:33:28 · 207 阅读 · 0 评论 -
洛谷P1216 [USACO1.5]数字三角形 Number Triangles(DP)
P1216 [USACO1.5]数字三角形 Number Triangles题解:太水了…详情请看博主另一篇题解POJ1163(同一道题)#include<bits/stdc++.h>using namespace std;int a[1024][1024],dp[1024][1024];int main(){#ifndef ONLINE_JUDGE freop...原创 2018-11-12 00:53:23 · 224 阅读 · 0 评论 -
洛谷P1057 传球游戏(dp)
P1057 传球游戏题解:dp[i][j]=dp[i+1][j−1]+dp[i−1][j−1]dp[i][j] = dp[i + 1][j - 1] + dp[i - 1][j - 1]dp[i][j]=dp[i+1][j−1]+dp[i−1][j−1]表示球传到第iii个人传球次数为jjj的时候的方案数。边界为dp[1][0]=1dp[1][0] = 1dp[1][0]=1。(这个不用多说叭…...原创 2018-11-12 00:14:04 · 237 阅读 · 0 评论 -
洛谷P1091 合唱队形(dp)
P1091 合唱队形题解:很容易想到最长单升子序列了,但是由于还要下降,所以再做一次最长单降子序列。最后枚举iii即可。代码#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;int a[111], dp[111][2];int main(){#ifndef ONLINE_JUDGE freopen(&quot;input.in&quot;,&原创 2018-11-11 22:09:55 · 322 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) B 吃豆豆(dp)
吃豆豆题解:不妨反向考虑,题目问到达并且至少获得CCC个糖果所需的最少时间,那么我们考虑位置为(i,j)(i,j)(i,j)时间为ttt的状态时所能获取的最大糖果数。那么答案就是dp[ex][ey][t]&gt;=Cdp[ex][ey][t] &gt;= Cdp[ex][ey][t]>=C时的ttt。然后dp[i][j][t]dp[i][j][t]dp[i][j][t]可以...原创 2019-01-31 20:15:44 · 371 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) E 流流流动(树形dp)
流流流动题解:题目是点的选与不选的问题,并且有连边,因此我们很容易想到树形dpdpdp,但是题目图的并不是联通的,因此我们可以将000与每一个连通集建边。然后考虑dp[u][1]dp[u][1]dp[u][1]表示选取以点uuu为根节点所能获得的最大收益,dp[u][0]dp[u][0]dp[u][0]表示不选uuu作为根节点所能获取的最大收益。所以有{dp[u][1]=dp[u][1]+max...原创 2019-01-31 20:29:23 · 286 阅读 · 0 评论 -
CF 933A - A Twisty Movement(DP)
933A - A Twisty Movement题意:给出一个只有111和222组成的序列,有一次可以将区间[l,r][l,r][l,r]逆置的机会,询问最长不下降子序列长度。题解:dp[i][j][k]dp[i][j][k]dp[i][j][k]求出以kkk结尾的区间[i,j][i,j][i,j]的最长不上升子序列长度。然后答案就是pre[i−1]+max(dp[i][j][1],dp[i]...原创 2019-10-04 21:22:09 · 442 阅读 · 0 评论 -
Codeforces Round #590 (Div. 3) F - Yet Another Substring Reverse(状压dp)
F - Yet Another Substring Reverse题意:给出一个字符串,有一次逆置任意子串的机会,询问一个最长子串的长度,要求子串每一个字母都不相同。题解:问题可以看成找两个不相交的子串,不同字母个数之和最大。因为不同字符个数最大为202020,考虑预处理出每一个区间的值,并维护每一个子集的最大值(也就是连续且不同字符个数最多),然后枚举两两子集之和即可。代码#includ...原创 2019-10-04 18:32:39 · 443 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia Shenyang Regional Contest C. Insertion Sort(打表找规律)
C. Insertion Sort题意:给出n,kn,kn,k,询问nnn的全排列中,有多少个排列在给前kkk个元素排完序后满足最长递增子序列长度大于等于n−1n-1n−1。题解:实际上好像是有公式的。但是我的做法比较蠢。打表肉眼找规律。可以发现当kkk固定不变,nnn递增的时候是有规律的。代码先贴一份打表的int dp[100];int main() {#ifndef ONLINE...原创 2019-09-06 15:15:45 · 533 阅读 · 0 评论 -
2050 Programming Competition 1006 冰水挑战(DP)
冰水挑战一开始想错了方程。。。导致最后没有做出来。题解:通过题意我们就可以知道这是一类很基础的背包问题,第iii项选与不选,时刻保持体力大于零。dp[i][j]dp[i][j]dp[i][j]表示对于前iii个挑战选了jjj个的最大剩余体力,那么就有,如果不选,则dp[i][j]=max(dp[i][j],dp[i−1][j]+c[i])dp[i][j] = max(dp[i][j],dp[...原创 2019-04-18 20:17:57 · 352 阅读 · 0 评论 -
Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree 树形dp
D. Serval and Rooted Tree题意:含有nnn个节点,并且以111为根节点的树的每个节点都有一个操作,用010101表示,如果为111,那么就取这个节点的孩子中的最大值,否则取孩子的最小值。问,如何安排可以使得根节点111的值最大。注意如果叶节点有kkk个,那么取值必须是1→k1\rightarrow k1→k。题解:如果去枚举叶子节点的取值肯定是不可以的了,复杂度过于高,...原创 2019-04-15 16:15:45 · 243 阅读 · 0 评论 -
Codeforces Round #552 (Div. 3) F - Shovels Shop(DP + 贪心)
F - Shovels Shop题意:有nnn件物品每个价值aia_iai,mmm个offer(x,y)offer(x,y)offer(x,y),对于每个offerofferoffer即,买xxx件物品,可以优惠掉其中yyy件最便宜的。问买kkk个物品的最少花费。题解:首先,对于每个offerofferoffer,xxx相同时,肯定yyy越大越好。其次,这些优惠肯定是从这nnn个物品中前...原创 2019-04-17 21:41:44 · 351 阅读 · 0 评论 -
Codeforces Round #267 (Div. 2) C. George and Job(DP)
C. George and Job题意:在序列aia_iai中选出kkk个不相交大小为mmm的区间,使其区间和最大。题解:dp[i][j]dp[i][j]dp[i][j]表示在前jjj个数里选iii个区间的最大区间和。则有dp[i][j]=max(dp[i−1][j−m]+sum[j]−sum[j−m],dp[i][j−1])dp[i][j] = max(dp[i - 1][j - m] +...原创 2019-04-15 23:38:30 · 196 阅读 · 0 评论 -
Educational Codeforces Round 61 (Rated for Div. 2) F. Clear the String(区间DP)
F. Clear the String题意:给出一个串,每次消去连续相同的子串,问最少多少次能把这个串消完。题解:入门区间dpdpdp。两种做法。做法一:记忆化dfsdfsdfs。首先肯定可以知道对于 一段区间[i,j][i,j][i,j],它只有两种情况,里面的字符全部相同,或者分成若干段相同区间。那么我们就可以暴力枚举区间里的中点,累加每段的区间贡献即可。对于每段区间里的字符,只要它和...原创 2019-03-09 11:55:41 · 192 阅读 · 0 评论 -
牛客练习赛40 C-小A与欧拉路(树形dp | 两次dfs 求树的直径)
C-小A与欧拉路题意:求图中最短的欧拉路。题解:因为是一棵树,因此当从某一个节点遍历其子树的时候,如果还没有遍历完整个树,一定还需要再回到这个节点再去遍历其它子树,因此除了从起点到终点之间的路,其它路都被走了两次,而我们要求总的路程最短,那么我们就让从起点到终点的路最长即可,也就是树的直径。所以答案就是所有边权的两倍再减去树的直径。代码两次dfs#include<bits/st...原创 2019-02-16 10:20:11 · 290 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) I 起起落落(dp)
起起落落题解:画一下图我们就可以发现要求的序列是波浪并且整体下降趋势的。pa[2k−1]&gt;pa[2k+1]&gt;pa[2k]p_{a[2k-1]}&gt;p_{a[2k+1]}&gt;p_{a[2k]}pa[2k−1]>pa[2k+1]>pa[2k]因此我们考虑dp[j]dp[j]dp[j]表示以jjj结尾的并且满足要求的子序列个数。那...原创 2019-02-02 10:53:05 · 371 阅读 · 0 评论 -
洛谷P1115 最大子段和
最大子段和题解:考虑以jjj为结尾的最大子段和。所以有dp[j]=max(a[j],dp[j−1]+a[j])dp[j] = max(a[j],dp[j - 1] + a[j])dp[j]=max(a[j],dp[j−1]+a[j])。最后遍历一遍即可。但是实际上发现可以用两个变量代替。代码#include<bits/stdc++.h>using namespace std;...原创 2018-11-11 21:53:37 · 269 阅读 · 0 评论 -
洛谷P1734 最大约数和(dp)
P1734 最大约数和题解:考虑和为sss的时候最大因数和。则有dp[s]=max(dp[s−j]+sum[j],dp[s])dp[s] = max(dp[s - j] + sum[j],dp[s])dp[s]=max(dp[s−j]+sum[j],dp[s]),写完才发现就是个背包。。。(预处理一下因数和)注意111的因数不包括它本身就没有了,所以dp[1]=0dp[1] = 0dp[1]=0...原创 2018-11-11 21:45:39 · 588 阅读 · 3 评论 -
TSP问题之状压dp
TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市,要求路径的总和最小。其中,2<=N<=15。看到n的这个范围,很多情况下就是状压了,因为所有可能的路线共有(n-1)!种,这个值太大了。状压就是将状态压缩成...原创 2018-04-02 23:27:36 · 996 阅读 · 0 评论 -
POJ 1276(多重背包+二进制优化)
Cash MachineTime Limit: 1000MS Memory Limit: 10000KDescriptionA Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cas...原创 2018-04-08 09:34:27 · 332 阅读 · 0 评论 -
PAT L3-001 凑零钱(01背包(布尔背包)+记录路径)
L3-001. 凑零钱时间限制:200 ms 内存限制:65536 kB 代码长度限制:8000 B 判题程序:Standard 作者:陈越韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。输入格式:...原创 2018-03-23 23:26:23 · 676 阅读 · 0 评论 -
2017年浙工大程序设计迎新赛决赛—网络同步赛 G-取数游戏2(区间dp)
G-取数游戏2时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld题目描述给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。输入描述:第一行一个数T,表示...原创 2018-03-13 21:22:05 · 354 阅读 · 0 评论 -
最佳加法表达式(动态规划)
最佳加法表达式有一个由1..9组成的数字串.问如果将m个加 号插入到这个数字串中,在各种可能形成的 表达式中,值最小的那个表达式的值是多少 输入1234 2 12345 3输出19 24问题分析要解决dp类问题,当然是要找子问题,确定目标状态的啦。 现在有n个数字组成的数字串,将m个加号插入里面求表达式的最小值。不如我们将其分解为两部分,第m个加号后面...原创 2018-03-02 16:39:06 · 704 阅读 · 0 评论 -
HDU 2844 Coins (多重背包+二进制优化)
CoinsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem DescriptionWhuacmers use coins.They have coins of value A1,A2,A3…An Silverland dollar. One day H...原创 2018-02-19 17:07:03 · 354 阅读 · 0 评论 -
HDU 1069(动态规划)
Monkey and BananaTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Problem DescriptionA group of researchers are designing an experiment to test the IQ of a mo...原创 2018-02-23 14:53:15 · 461 阅读 · 0 评论 -
HDU 1176(动态规划+类似数塔)
免费馅饼Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Problem Description都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围...原创 2018-02-22 12:54:22 · 282 阅读 · 0 评论 -
POJ 1163(数字三角形+动态规划)
The TriangleTime Limit: 1000MS Memory Limit: 10000KDescription7 3 8 8 1 0 2 7 4 4 4 5 2 6 5(Figure 1)Figure 1 shows a number triangle. Write a program that cal...原创 2018-02-22 12:18:19 · 912 阅读 · 0 评论 -
HDU 1087(最大上升子序列+动态规划)
Super Jumping! Jumping! Jumping!Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Problem DescriptionNowadays, a kind of chess game called “Super Jumping! Jump...原创 2018-02-21 10:13:28 · 793 阅读 · 0 评论 -
BAPC 2014 Preliminary D
Lift Problems问题分析题意就是每次电梯停止,都会引起想要在更高层停的同学的怒火,还有本想要在更低层停却并没有停的同学的怒火。 蒻当时想了会,感觉是dp,但是这道题有不同做法,dp的O(N2)O(N2)O(N^2)做法只是其中一种。虽然有O(N)O(N)O(N)的做法,但是蒻不太会,所以只提及dp的做法。 做dp想出状态方程就好做了。 到当前第ii\:i\:层电梯停止至...原创 2018-07-08 21:12:10 · 281 阅读 · 0 评论 -
openjudge 海贼王之伟大航路(状压dp)
问题分析我们去考虑如何设计一个状态,才能满足无后效性和最优子结构呢? 如果我们从一维去想,用dp[v]dp[v]dp[v]表示终点为vvv时花费的最小时间是多少,那么明显是不够的,因为它无法保证你是否访问节点的时候会重复,然鹅题目要求恰好每一个节点只访问一次。所以,我们去加一维集合状态去约束它。用dp[S][v]dp[S][v]dp[S][v]来表示恰好已经无重复访问节点集合SSS并且终点为...原创 2018-07-29 01:42:08 · 351 阅读 · 0 评论 -
洛谷P1002 过河卒(简单递推dp)
P1002 过河卒题解:先把马阻挡的地方给标记上,然后递推即可。dp[i][j]dp[i][j]dp[i][j]代表卒走到(i,j)(i,j)(i,j)所可行的路线数。#include<bits/stdc++.h>typedef long long LL;using namespace std;const int dir[2][9]={{0,-2,-1,1,2,2,1,-1,...原创 2018-11-11 21:35:23 · 364 阅读 · 0 评论 -
洛谷P1719 最大加权矩形
P1719 最大加权矩形题解:最大子段和的升级版,最大子矩阵和吧。考虑将每一列压缩一下,然后枚举行的组合即可。代码#include<bits/stdc++.h>using namespace std;int a[101][101], dp[101], t[101], n;int solve(){ int ans = -1e9; for(int i = 1; i &...原创 2018-11-09 13:55:09 · 313 阅读 · 0 评论 -
洛谷P1095 守望者的逃离(dp)
P1095 守望者的逃离题解:每次有三种决策:闪现,跑步,停下休息。由于闪现和跑步不太好同时处理,因为有魔法消耗所以一开始贪心的尽可能多使用闪现,魔法不够就停下休息恢复。最后再考虑何时跑步。代码#include<bits/stdc++.h>using namespace std;int dp[300010];int main(){#ifndef ONLINE_JUDG...原创 2018-10-24 19:54:25 · 221 阅读 · 0 评论