2025/7/18 动态规划专题

2025/7/18 \(\mathbf{} \begin{Bmatrix} \frac{{\Large LEARN} }{{\color{Yellow}\Large Record} }\mathbf{} {No.10} \end{Bmatrix}\times{}\) NeeDna

序号 题号 来源 题目名称 知识点标签 难度(洛谷难度标记) 一句话题解(尽量) 备注(推荐理由,题目特点等等)
1 P2831 Luogu 愤怒的小鸟 状态压缩DP 提高+/省选− dp[S]表示已经死了的猪的集合状态为S时最少要发射的鸟数 注意细节优化 状压DP 细节
2 CF708C CF Centroids 动态规划DP 树形DP 换根DP 提高+/省选− 拆掉siz大于要求的子树中最大的满足大小要求的子树,连接到询问节点上 换根DP
3 HDU3001 HDU Travelling 状态压缩DP 提高+/省选− 0/1/2 分别表示 未到达/到1次/到两次 三进制操作
4 P6596 Luogu How Many of Them 动态规划DP 思维 图论 NOI/NOI+/CTSC 正难则反 减去不连通图 拼凑组合 计数类DP 思维 结合图论
5 CF559C CF Gerald and Giant Chess 动态规划DP 计数 提高+/省选− 正难则反 考虑减去非法路径 按第一个遇到的障碍分类 计数类DP 思维
6 P6189 Luogu [NOI Online #1 入门组] 跑步 动态规划DP 根号分治 分块 省选/NOI− 完全背包+分块思路 分块
7 P3211 Luogu [HNOI2011] XOR和路径 动态规划DP 高斯消元 期望 省选/NOI− 列出方程后高斯消元解出来即可 有后效性DP
8 P10958 Luogu 启示录 动态规划DP 数位DP 提高+/省选− 经典的标准数位DP 经典题目
9 CF1063F CF String Journey 动态规划DP 字符串 NOI/NOI+/CTSC 观察发现性致 dp[i]≤dp[i−1]+1 剩下用字符串操作 与字符串算法结合
10 P1081 Luogu [NOIP 2012 提高组] 开车旅行 动态规划DP 倍增优化 省选/NOI− 双向链表处理目的地 然后用倍增计算里程数和到达城市 倍增优化DP
11 P3287 Luogu [SCOI2014] 方伯伯的玉米田 动态规划DP 树状数组 省选/NOI− 二维树状数组维护DP 二维树状数组
12 CF1144G CF Two Merged Sequences 动态规划DP 提高+/省选− 把两个序列的末尾,一个确定在i位置,另一存数组里,可以满足最优子结构。 思维 输出方案
13 P6064 Luogu [USACO05JAN] Naptime G 动态规划DP 环形处理 普及+/提高 前后复制两份序列,再做DP 环形处理
14 P4655 Luogu [CEOI 2017] Building Bridges 动态规划DP 李超线段树 CDQ分治 省选/NOI− 正常DP 之后采用李超线段树优化即可 DP优化
15 P2569 Luogu [SCOI2010] 股票交易 动态规划DP 单调队列优化 提高+/省选− 标准单调队列优化DP 经典题目
16 UVA10304 UVa Optimal Binary Search Tree 动态规划DP 四边形不等式优化 提高+/省选− BST的中序遍历完美对应区间DP BST 区间DP 四边形不等式优化
17 P1912 Luogu [NOI2009] 诗人小G 动态规划DP 四边形不等式优化 省选/NOI− 四边形不等式优化DP 四边形不等式优化
18 CF24D CF Broken robot 动态规划DP 高斯消元 期望 省选/NOI− 列出方程后高斯消元解出来即可 有后效性DP
19 CF2107F1 CF Cycling (Easy Version) 动态规划DP 思维 提高+/省选− 用一个小的往后放,再不断往前跳,枚举分割点 思维
20 P7690 Luogu [CEOI 2002] A decorative fence 动态规划DP 思维 普及+/提高 只考虑排名 不考虑具体长度 通过试填法完成 类似数位DP 思维
21 P6146 Luogu [USACO20FEB] Help Yourself G 动态规划DP 前缀和优化 树状数组 普及+/提高 对左端点排序 复杂度就只为不变或+1 思维 DP优化
22 CF981E CF Addition on Segments 动态规划DP 线段树分治 bitset 提高+/省选− bitset优化线段树分治 或者直接线性dp 记录最大值位置 思维 DP优化
23 P8820 Luogu [CSP-S 2022] 数据传输 动态DP 贪心 思维 矩阵优化 省选/NOI− 分k讨论思考 动态DP 矩阵优化 动态DP 矩阵优化
24 P9838 Luogu 挑战 NPC IV 动态规划DP 思维 省选/NOI− 考虑本质不同的 a 序列,这种情况下优美度的值域很小。转移时枚举当前位填什么数。 思维
25 P2605 Luogu 基站选址 动态规划DP 省选/NOI− 线段树优化 DP 经典题目
26 CF2107F2 CF Cycling (Hard Version) 动态规划DP 斜率优化 李超线段树 省选/NOI− 优化DP式即可 DP优化
27 CF1174E CF Ehab and the Expected GCD Problem 动态规划DP 贪心 数学 省选/NOI− gcd 只能长成2^x 3^y的样子,y只能取0或1 贪心思维 数学
28 P11958 Luogu 「ZHQOI R1」划分 动态规划DP 思维 省选/NOI− 把问题转为选不相交区间 取端头相乘 方便DP 可以证明问题答案相等 思维
29 P3195 Luogu 玩具装箱 动态规划DP 斜率优化 省选/NOI− 常规斜率优化 经典题目
30 P3232 Luogu 游走 动态规划DP 高斯消元 期望 省选/NOI− 算点的期望访问次数 推出边上的 高斯消元 有后效性DP
31 CF750E CF New Year and Old Subsequence 动态规划DP 线段树 矩阵优化 省选/NOI− 重定义矩阵乘法 在线段树上维护 矩阵优化
32 P4072 Luogu 征途 动态规划DP 斜率优化 省选/NOI− 写出DP式套用斜率优化套路即可 二维斜率优化
33 CF1860D CF Balanced String 动态规划DP 提高+/省选− 最后答案容易直接算出(顺序对和逆序对之和为固定值) 状态中设出01使用情况 思维
34 P3780 Luogu [SDOI2017] 苹果树 动态规划DP 树形DP 背包 NOI/NOI+/CTSC 单调队列优化多重背包 拆点 卡常
35 P6326 Luogu Shopping 动态规划DP 树形DP 背包 点分治 省选/NOI− 树上多重背包 二进制拆分优化 点分治递归 树上依赖性背包
36 CF708E CF Student's Camp 动态规划DP 期望 省选/NOI− 列式后 前缀和优化DP 期望DP DP优化
37 P10974 Luogu Accumulation Degree 动态规划DP 树形DP 换根DP 提高+/省选− 树上DP后考虑换根DP一次即可 经典题目
38 P10982 Luogu Connected Graph 动态规划DP 计数 提高+/省选− 正难则反 减去不连通图 计数类DP 思维

P3232 [HNOI2013] 游走

题目描述

给定一个 \(n\) 个点 \(m\) 条边的无向连通图,顶点从 \(1\) 编号到 \(n\),边从 \(1\) 编号到 \(m\)

小 Z 在该图上进行随机游走,初始时小 Z 在 \(1\) 号顶点,每一步小 Z 以相等的概率随机选择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小 Z 到达 \(n\) 号顶点时游走结束,总分为所有获得的分数之和。 现在,请你对这 \(m\) 条边进行编号,使得小 Z 获得的总分的期望值最小。

code:

#include<bits/stdc++.h>
using namespace std;
int read(){
    int f=1,k=0;char c=getchar();
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    if(c=='-') f=-1,c=getchar();
    while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+c-48,c=getchar();
    return f*k;
} 
const int N=510;
const int M=125010;
int n,m,out[N],u[M],v[M];
vector<int>t[N];
double ans=0,a[N][N],g[M];
void guess(int n){
	for(int i=1;i<=n;i++){
		int maxn=i;
		for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[maxn][i])) maxn=j;
		for(int j=1;j<=n+1;j++) swap(a[maxn][j],a[i][j]);
		for(int j=n+1;j>=i;j--) a[i][j]=a[i][j]/a[i][i];
		for(int j=1;j<=n;j++){
			if(j!=i){
				double temp=a[j][i]/a[i][i];
				for(int k=1;k<=n+1;k++) a[j][k]-=a[i][k]*temp;
			}
		}
	}
} 
int main(){
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		if(x==n) swap(x,y);
		u[i]=x,v[i]=y;
		t[x].push_back(y);t[y].push_back(x);
		out[x]++;out[y]++;
	}
	a[1][n]=1.0;
	for(int i=1;i<n;i++){
		a[i][i]=1.0;
		for(int j:t[i]){
			if(j!=n) a[i][j]=-1.0/out[j];
		}
	}
	guess(n-1);
	for(int i=1;i<=m;i++){
		if(v[i]==n) g[i]=a[u[i]][n]*1.0/out[u[i]];
		else g[i]=a[u[i]][n]*1.0/out[u[i]]+a[v[i]][n]*1.0/out[v[i]];
	}
	sort(g+1,g+1+m);
	for(int i=1;i<=m;i++) ans+=g[i]*1.0*(m-i+1);
	cout<<fixed<<setprecision(3)<<ans;
}

P10982 Connected Graph

题目描述

\(n\) 个结点的有标号无向连通图个数。

做法

** \(n\) 个节点的连通图个数**等于 \(n\) 个节点的图的个数减去 \(n\) 个节点不连通的图的个数

对于 \(n\) 个点的图可以发现其最多有 \(\frac {n\times(n-1)}{2}\) 条边,每条边可以选或者不选,共计 \(2^{\frac {n\times(n-1)}{2}}\) 种方案。

对于 \(n\) 个节点不连通的图,发现可以由①一个连通的 包含一个固定节点 的有 \(k\) 个节点的子图②一个与之不连通的任意的子图构成。①的值可以用之前的数据(即 \(ans_k\)),而②因为剩下共计 \(n-k\) 个节点,\(\frac{(n-k)\times(n-k-1)}{2}\) 条边,可知能贡献 \(2^{\frac{(n-k)\times(n-k-1)}{2}}\) 种方案。注意到①选择 \(k\) 个节点的方案有 \(C_{n-1}^{k-1}\) 种,故最终转移方程为 \(\displaystyle ans_n=2^{\frac {n\times(n-1)}{2}}-\sum_{k=1}^{n-1}\left(C_{n-1}^{k-1}\times ans_k\times 2^{\frac{(n-k)\times(n-k-1)}{2}}\right)\)

按照转移方程实现即可,时间复杂度 \(\Theta(n^2)\),不要忘记取模,且模数需要用 long long 存储。

CF1144G Two Merged Sequences

题目描述

最初存在两个整数序列,其中一个是严格递增的,另一个是严格递减的。

严格递增序列是整数序列 \([x_1 < x_2 < \dots < x_k]\)。严格递减序列是整数序列 \([y_1 > y_2 > \dots > y_l]\)。注意,空序列和只包含一个元素的序列也可以视为递增或递减序列。

递增序列的元素被插入到递减序列的元素之间(也可能插入到递减序列的第一个元素之前或最后一个元素之后),且不改变递增序列和递减序列各自的顺序。例如,序列 \([1, 3, 4]\)\([10, 4, 2]\) 可以生成如下结果序列:\([10, \textbf{1}, \textbf{3}, 4, 2, \textbf{4}]\)\([\textbf{1}, \textbf{3}, \textbf{4}, 10, 4, 2]\)。但如下序列不能作为插入结果:\([\textbf{1}, 10, \textbf{4}, 4, \textbf{3}, 2]\),因为递增序列的元素顺序被改变了。

设最终得到的序列为 \(a\)。该序列 \(a\) 已在输入中给出。你的任务是找出任意一组符合要求的初始序列,其中一个为严格递增序列,另一个为严格递减序列。注意,空序列和只包含一个元素的序列也可以视为递增或递减序列。

如果输入存在矛盾,无法将给定序列 \(a\) 拆分为一个递增序列和一个递减序列,请输出 "NO"。

P6146 [USACO20FEB] Help Yourself G

题目描述

在一个数轴上有 \(N\) 条线段,第 \(i\) 条线段覆盖了从 \(l_i\)\(r_i\) 的所有实数(包含 \(l_i\)\(r_i\))。

定义若干条线段的为一个包含了所有被至少一个线段覆盖的点的集合。

定义若干条线段的复杂度为这些线段的并形成的连通块的数目。

现在 Bessie 想要求出给定 \(N\) 条线段的所有子集(共有 \(2^N\) 个)的复杂度之和对 \(10^9+7\) 取模的结果。

你也许猜到了,你需要帮 Bessie 解决这个问题。但不幸的是,你猜错了!在这道题中你就是 Bessie,而且没有人来帮助你。一切就靠你自己了!

P1081 [NOIP 2012 提高组] 开车旅行

题目描述

\(\text{A}\) 和小 \(\text{B}\) 决定利用假期外出旅行,他们将想去的城市从 $1 $ 到 \(n\) 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 \(i\) 的海拔高度为\(h_i\),城市 \(i\) 和城市 \(j\) 之间的距离 \(d_{i,j}\) 恰好是这两个城市海拔高度之差的绝对值,即 \(d_{i,j}=|h_i-h_j|\)

旅行过程中,小 \(\text{A}\) 和小 \(\text{B}\) 轮流开车,第一天小 \(\text{A}\) 开车,之后每天轮换一次。他们计划选择一个城市 \(s\) 作为起点,一直向东行驶,并且最多行驶 \(x\) 公里就结束旅行。

\(\text{A}\) 和小 \(\text{B}\) 的驾驶风格不同,小 \(\text{B}\) 总是沿着前进方向选择一个最近的城市作为目的地,而小 \(\text{A}\) 总是沿着前进方向选择第二近的城市作为目的地(注意:本题中如果当前城市到两个城市的距离相同,则认为离海拔低的那个城市更近)。如果其中任何一人无法按照自己的原则选择目的城市,或者到达目的地会使行驶的总距离超出 \(x\) 公里,他们就会结束旅行。

在启程之前,小 \(\text{A}\) 想知道两个问题:

1、 对于一个给定的 \(x=x_0\),从哪一个城市出发,小 \(\text{A}\) 开车行驶的路程总数与小 \(\text{B}\) 行驶的路程总数的比值最小(如果小 \(\text{B}\) 的行驶路程为 \(0\),此时的比值可视为无穷大,且两个无穷大视为相等)。如果从多个城市出发,小 \(\text{A}\) 开车行驶的路程总数与小 \(\text{B}\) 行驶的路程总数的比值都最小,则输出海拔最高的那个城市。

2、对任意给定的 \(x=x_i\) 和出发城市 \(s_i\),小 \(\text{A}\) 开车行驶的路程总数以及小 \(\text B\) 行驶的路程总数。

CF1174E Ehab and the Expected GCD Problem

题目描述

我们定义一个函数 \(f(p)\),作用于一个排列 \(p\)。令 \(g_i\) 表示 \(p_1, p_2, \ldots, p_i\) 的最大公约数(即长度为 \(i\) 的前缀的最大公约数)。那么 \(f(p)\) 就是 \(g_1, g_2, \ldots, g_n\) 中不同元素的个数。

\(f_{max}(n)\) 表示所有 \(1, 2, \ldots, n\) 的排列 \(p\)\(f(p)\) 的最大值。

给定整数 \(n\),请计算有多少个排列 \(p\) 满足 \(f(p) = f_{max}(n)\)。由于答案可能很大,请输出其对 \(1000000007 = 10^9 + 7\) 取模的结果。

CF559C Gerald and Giant Chess

给定一个 $h×w $ 大小的棋盘,其中有 \(n\) 个点为黑色。
每次只能向右或向下移动,求从 \((1,1)\) 不经过黑色点到达 \((h,w)\) 的方案数。 \(h,w\le 10^5\)

P11958 「ZHQOI R1」划分

题目背景

请注意本题特殊的空间限制。

题目描述

给定一个长度为 \(n\) 的序列 \(a\),你需要将 \(a\) 划分成若干个非空连续子段。

对于每个子段 \([l,r]\),定义其贡献 \(w=(\min_{i=l}^{r}a_i)\times(\max_{i=l}^{r}a_i)\)。你需要找出一种划分方式,使 \(\sum w\) 的值最小,输出这个最小值。

P7690 [CEOI 2002] A decorative fence

题目描述

一个木栅栏由 \(N\) 块木板组成,每块木板垂直排成一排。除此之外,当且仅当满足以下条件时,围栏看起来很可爱:

  • 木板有不同的长度,即 \(1,2,\cdots,N\) 为木板长度单位。
  • 每块有两个相邻的木板,它要么比它的相邻的都大,要么比它相邻的都小。(即,这会使得围栏顶部交替上升和下降(高低起伏))。

求描述列表带有 \(N\) 个木板的第字典序第 \(C\) 小个栅栏。更准确地说,求栅栏排列 \(a_1,\cdots,a_N\)

P6596 How Many of Them

题目描述

在无向连通图中,若一条边被删除后,图会分成不连通的两部分,则称该边为割边。

求满足如下条件的无向连通图的数量:

  1. \(n\) 个结点构成,结点有标号。

  2. 割边不超过 \(m\) 条。

  3. 没有重边和自环。

答案对 \(10^{9}+7\) 取模。

给出 \(n,m\) 求方案数。

CF708E Student's Camp

有一个 \((n+2)×m\) 的网格。

除了第一行和最后一行,其他每一行每一天最左边和最右边的格子都有 \(p\) 的概率消失。

\(k\) 天后,网格始终保持连通的概率。

\(n,m≤1.5×103\)\(k≤105\),答案对 \(10^9+7\) 取模。

posted @ 2025-07-18 15:59  NeeDna  阅读(32)  评论(0)    收藏  举报