ACM-动态规划
文章平均质量分 73
ACM-动态规划(DP)
nefu-ljw
这个作者很懒,什么都没留下…
展开
-
CCF-CSP 202104-4 校门外的树【dp+因子数集合】
题目链接http://118.190.20.162/view.page?gpid=T125思路对于n=2的情况,假设障碍物位置分别是a[i]和a[j](i>j),即两个障碍物相邻,中间没有障碍物阻挡,区间长度为a[i]-a[j],容易想到ans=f(a[i]−a[j])ans=f(a[i]-a[j])ans=f(a[i]−a[j]),其中f(x)f(x)f(x)函数表示求xxx的因子个数(注意,此处的因子包括1,但不包括xxx自身)。对于n>2,考虑O(n2)O(n^2)O(n2)复杂度原创 2022-03-18 12:15:14 · 791 阅读 · 2 评论 -
2019年第十届蓝桥杯省赛 C++大学A组 I题 糖果【状压dp】
传送门:AcWing 1243. 糖果思路状态压缩,将每包取的糖果集合压缩成一个二进制数,设第iii包糖果的二进制数为a[i]a[i]a[i]。dp[i]dp[i]dp[i]表示组成状态iii所需的最小包数。从状态jjj取第iii包糖果转移到的下一状态to=j∣a[i]to=j|a[i]to=j∣a[i],即:dp[to]=min(dp[to],dp[j]+1)dp[to]=min(dp[to],dp[j]+1)dp[to]=min(dp[to],dp[j]+1)AC代码#include <原创 2020-10-16 18:31:12 · 782 阅读 · 0 评论 -
超级码力在线编程大赛初赛 第1场 T4.对称前后缀【字符串/区间DP】
思路用dp[j][i]表示[j,i]区间内的最长前后缀的一半(奇数则不算中间那个数)。转移方程:dp[j][i]=dp[j+1][i-1]+1dp[j][i]=dp[j+1][i−1]+1考虑两种情况:①[j,i]区间内最长前后缀重合。例如abba,此时dp[1][2]=1,dp[0][3]=2,对于[0,3]区间,ans+=2*dp[0][3]。②[j,i]区间内最长前后缀被隔断(无法重合)。例如abca,此时dp[0][3]=1,对于[0,3]区间,ans+=dp[0][3]。原创 2020-08-29 17:31:38 · 360 阅读 · 0 评论 -
2020年百度之星程序设计大赛(初赛三) 1005题 Chess【二维DP】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6787思路设dp[i][j]表示到达位置i时,已经放了j个传送门。初始时,只要j=0,则dp[i][j]=1;其余情况用k表示在位置i之前有多少个连续的传送门,则方程为dp[i][j]=dp[i][j]+dp[i−k−1][j−k]∗{(i−k−1)∗(i−k−2)∗...∗(i−2)},k∈[1,10]dp[i][j]=dp[i][j]+dp[i-k-1][j-k]*\{(i-k-1)*(i-k-2原创 2020-07-27 12:09:09 · 301 阅读 · 0 评论 -
POJ 1651 Multiplication Puzzle【最优矩阵链乘,DP】
其实就是算法课上的例题,找到oj上的题提交测试一下。POJ 1651 Multiplication Puzzle题意可以转换为:给你n-1个矩阵(a0∗a1,a1∗a2,...,an−2∗an−1a_0*a_1, a_1*a_2 ,..., a_{n-2}*a_{n-1}a0∗a1,a1∗a2,...,an−2∗an−1),要将它们全部相乘,求一种加括号的乘法次序,使得矩阵的乘法次数之和最小,也就是动态规划中经典的最优矩阵链乘问题。设dp[i][j]dp[i][j]dp[i][j]表示第i原创 2020-06-05 14:58:18 · 727 阅读 · 0 评论 -
洛谷 P1880 石子合并【区间DP+记忆化搜索】
洛谷 P1880 石子合并因为是在圆形操场中合并,也就是一个环,为了得到所有可能情况,断环为链,变成长度为2*n的链。dfs函数搜索[l,r]区间,得到相应的dp值。这题也是区间DP,记忆化搜索可能比较好理解。#include <bits/stdc++.h>using namespace std;const int N=205;int n,a[N],dp1[N][N],dp2[N][N],sum[N];int dfs1(int l,int r)//求dp1,dp1[i][j]表示在区间[i,原创 2020-03-02 22:03:20 · 227 阅读 · 0 评论 -
2020牛客寒假算法基础集训营1 F题 maki和tree【DFS+树形DP】(详细题解,完整思路)
题目传送门:https://ac.nowcoder.com/acm/contest/3002/F基本思路要求只经过一个黑点的路径数量,可以分两种情况:1.起点和终点均是白点,其余路径中只有一个黑点。2.起点和终点为一黑一白,其余路径中全部是白点。把树分成若干个连通块构成,连通块有两种,一是全为白点,二是只有一黑点,其他全白点(特殊地,也可以只有一黑点,无白点)。这里的“连通块”,意义与图论中含限制条件的最大连通分量相同。设dp[i][0]表示以 i 为根的子树(包括 i原创 2020-02-28 23:56:29 · 352 阅读 · 0 评论 -
入门级动态规划刷题指南(线性DP)
这是好久好久好久好久好久之前写的文章了(19年4月最后更新)然后我不知道干啥去了,就忘记发布了...今天我看草稿箱,这文章都写得差不多了,竟然没发布,鸽了快一年(咕咕咕)## [poj 1163 The Triangle](http://poj.org/problem?id=1163)数字三角形,初学DP都是从本题开始做起的。这类题其实有固定的套路,先开一个dp数组记录走到(i,j)位置时的数字之和。第一步,令起点处的dp值等于a值。第二步,从起点开始向终点递推(跳过起点),走到(i,j)时,根原创 2020-03-01 15:22:22 · 490 阅读 · 0 评论 -
树形DP(2019.8.9训练)
poj 1655 Balancing Act求树的重心。从任意一个点开始搜索,把它作为树的根j注意dfs函数中多次递归,dfs函数内的一些变量不要写成全局变量,否则会错。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int N=2e4+...原创 2019-08-16 12:49:44 · 206 阅读 · 0 评论 -
单调队列&&单调队列优化DP(2019.5.25训练)
先介绍C++的STL中双端队列的使用方法。定义双端队列deque<node>q;双端队列对队首和队尾都可以进行入队和出队操作,具体如下:q.push_front(x);//x入队首q.push_back(x);//x入队尾q.pop_front();//删除队首元素q.pop_back();//删除队尾元素洛谷 P1440 求m区间内的最小值维护一个单调递增的双端队...原创 2019-05-31 20:53:52 · 358 阅读 · 0 评论 -
DP-四种背包问题模板总结【01背包、完全背包、多重背包、混合背包】
(转载链接)三种背包的概念区分01背包(ZeroOnePack):有N件物品和一个容量为V的背包。每种物品均只有一件。 第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。完全背包(CompletePack):有N种物品和一个容量为V的背包,每种物品都有无限件可用。 第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背...原创 2019-04-26 17:45:49 · 2029 阅读 · 0 评论