ZR8.2 DP

DP

1CF1101D

我们发现,最终答案一定和质因数有关

我们发现\(w_i <= 2*10^5\)级别的树,他的素因子的个数不会非常多(\(<=10\))

然后我们就设

gcd是\(dp_{u,v}\)表示\(u\)节点的第\(v\)个素因子的倍数答案

很明显答案只能从相同的质因子去转移
\[
dp_{u,v} = \max_{p_v = p_{v'}}{(dp_{son_u,v'})} + 1
\]
每次合并子树时利用dp数组更新ans就好了

2 CF1039D

很明显,当\(k > \frac{2}{n}\)时答案是\(1\)或者\(0\)

这种情况提前预处理一下直径就好了

当\(k <= \frac{2}{n}\)时

我们设\(dp_{i}\)表示\(i\)子树内的最长链

每次在合并时,如果存在长度和大于\(k\)的两条链,我们就贪心合并

这样的话时间复杂度是

\(O(n^2/2)\)

CF开\(7s\)卡卡常吧

接下来想想怎么优化时间复杂度

我们发现

答案是类似于数论分块那样递减的

且\(max_{ans} <= \sqrt n\)

对于\(\sqrt n\)段中的每一段我们都二分他的边界

每次check就做上面的DP

时间复杂度\(O(n\sqrt nlogn)\)

CF1097G

首先\(k = 1\)时我们有做法

枚举边,计算边的贡献

比如我们当前枚举了\((u,v)\)

那么贡献就是\((2^{size_u} - 1)*(2^{size_v} - 1)\)

但是这种做法只适用于\(k = 1\)

因为我们是枚举了边,判断有多少点集\(S\)满足条件

但是如果\(k>1\),很明显这条边在不同点集的贡献不一定相同,所以上述方法就莫得了

我们先考虑多项式做法

考虑设$dp_{u,v} \(表示\)u\(为根的子树,选了\)v\(条边,且同时满足\)u$点被选择了的方案数

当然,这种情况要考虑的情况有些复杂

要考虑根选不选的情况之类的

这样的树形背包时间复杂度是\(n^2\)的

首先
\[
x^k = \sum_{i = 0}^kC_x^i*i!*S(k,i)
\]
其中\(S(k,i)\)表示第二类斯特林数,将\(k\)个元素划分成\(i\)个集合(集合是相同的)的方案数
\[
S(i,j) = S(i - 1,j - 1) + S(i - 1,j) * j
\]
\(x^k\)其实就是\(x\)球放到\(k\)的个筐里的方案数

右边就是我们强制

我们将原题中的式子带进去
\[
\begin{align}
ans &= \sum_{X}\sum_{i = 0}^kC_{f(X)}^i*i!*S(f(X),i)\&=\sum_{i = 0}^ki!S(f(X),i)\sum_{X} C_{f(X)}^i
\end{align}
\]
然后就掉线了,去问smy

CF 1061 CMultiplicity

我们设\(f_{i,j}\)表示前\(i\)个数长度为\(j\)的方案数

很明显如果选的话\(j\)应该是\(a_i\)的因子

我们\(j\)只需要枚举\(a_i\)的因子

所以时间复杂度\(O(n\sqrt n)\)

CF 886E Maximum Element

咕咕咕去问smy或者mjy

CF1096D

设\(f_{i,0,1,2,3}\)表示\(1-i\)组成的子序列,求满足已经有\(s_{0,1,,2,3}\)结尾的子序列的方案数

转移看当前字符是啥就好了

子串的话就把所有连续的h和d压成一个

每次遇到hard贪心就好

CF979E

如果一个图是给你的

直接\(dp_{i,0,1}\)表示到达\(i\)点且

咕咕咕

Hero Meet Devil(HDU4899)

本来\(LCS\)就是一个不太平凡的DP问题

结果我们发现我们总的DP转移时还要用到LCS

之后我们考虑LCS的DP过程

当\(a_i = b_i\)时
\[
f_{i,j} = f_{i - 1,j - 1} + 1
\]
当\(a_i!=b_i\)时
\[
f_{i,j} = \max{(f_{i - 1,j},f_{i,j - 1})} + 1
\]
我们发现一个神奇的东西
\[
f_{i,j- 1} <= f_{i,j} <= f_{i,j} + 1
\]
然后我们就可以用差分序列把这个东西给 压起来

考虑外层转移

我们设\(state_{i,j}\)表示在状态\(i\)后面添加字符\(s_j(s_j \in(A,C,G,T))\)将要转移到的状态
\[
dp_{len + 1,state_{i,j}}+=dp_{len,i}
\]
发现外层转移就比较简单了

XHXJ’s LIS(HDU4352)

CF1043F

我们发现最终答案不会大于\(7\)。。。。

因为\(2 \times 3 \times 5 \times 7\times11 \times 13 \times 17 >=3\times10^5\)

咕咕咕

原文地址:https://www.cnblogs.com/wyxdrqc/p/11290662.html

时间: 2024-10-17 22:30:36

ZR8.2 DP的相关文章

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

51Nod 1009 数字1的个数 | 数位DP

题意: 小于等于n的所有数中1的出现次数 分析: 数位DP 预处理dp[i][j]存 从1~以j开头的i位数中有几个1,那么转移方程为: if(j == 1) dp[i][j] = dp[i-1][9]*2+pow(10,i-1);else dp[i][j] = dp[i-1][9]+dp[i][j-1]; 然后注意下对于每个询问统计的时候如果当前位为1需要额外加上他后面所有位数的个数,就是n%pow(10,i-1); 这样总复杂度log(n)*10 #include <bits/stdc++.

HDU 3555 Bomb (数位DP)

数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下来. 简介: 顾名思义,所谓的数位DP就是按照数字的个,十,百,千--位数进行的DP.数位DP的题目有着非常明显的性质: 询问[l,r]的区间内,有多少的数字满足某个性质 做法根据前缀和的思想,求出[0,l-1]和[0,r]中满足性质的数的个数,然后相减即可. 算法核心: 关于数位DP,貌似写法还是

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

bzoj1801: [Ahoi2009]chess 中国象棋 [dp]

Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中N,M不超过10050%的数据中,N,M至少有一个数不超过

状压DP问题

状态压缩·一 题目传送:#1044 : 状态压缩·一 AC代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdi

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp