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}
\]

我们发现这个东西平方没有了

边数大小相同的集合就可以放在一起计算了,我们设\(dp_{i,j}\)表示\(i\)为子树的根同时满足有\(j\)条边的方案数

dp的时候就是树上背包合并,注意枚举一条边选不选

CF 1061 CMultiplicity

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

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

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

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

CF 886E Maximum Element

我们考虑补集法正难则反

先考虑这个程序完全运行完毕的方案数

另外这种只和大小关系有关的题目每一步都可以去看做一个排列去做

我们设\(dp _{i}\)表示\(1-i\)的排列的最终运行完毕的方案数

首先\(i\)必须在\([i - k + 1,i]\)这个区间内

我们考虑转移时枚举最大值出现的位置\(j\)

\[\begin{align}
dp_{i} &= \sum_{j = i -k + 1}^idp_{j - 1}C_{i - 1}^{j - 1}*(i - j)!\\
&= \sum_{j = i - k + 1}^idp_{j - 1}\frac{(i - 1)!(i - j)!}{(j - 1)!(i - j)!}\\
&= \sum_{j = i - k + 1}^idp_{j - 1}\frac{i - 1}{j - 1}\\
&=(i- 1)!\sum_{j = i - k}^{i - 1}\frac{dp_j}{j}
\end{align}
\]

我们发现我们转移的时候只需要顺便记录一下\(\frac{dp_j}{j}\)的前缀和就可以做到\(O(1)\)转移了

但这只是答案补集的一部分

我们还需要考虑在中途就遇到了\(n\)然后停止的情况

设这一部分的方案为\(S\),枚举\(n\)出现的位置

\[S = \sum_{i = 1}^ndp_{i - 1}*(n - i)!
\]

最后用\(n!\)减去\(dp_n\)和\(S\)就是答案

CF1096D

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

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

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

每次遇到hard贪心就好

CF979E

如果一个图是给你的

直接\(dp_{i,0,1}\)表示到达\(i\)点且当前路径条数奇偶性为\(0,1\)的方案数

如果没给你,我们考虑一下最暴力的转移方法

\(f_{i,ow,ob,ew,eb}\)表示当前在第\(i\)个点,且同时满足有偶白\(ow\)个,偶黑\(ob\)个,奇白\(ew\)个,奇黑\(eb\)个的奇偶性

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}
\]

发现外层转移就比较简单了

说一下在我在做这个题中犯的错误吧

我们新加入一个\(i\)时

由于我用来求DP的\(g\)数组是滚动的

所以应该倒序枚举或者记录原来状态,我直接正序枚举用了更新以后的状态.

#include<iostream>
#include<algorithm>
#include<queue>
#include<cctype>
#include<cstring>
#include<vector>
#include<cstdio>
#define debugint(x) cerr << #x << ' ' << x << std::endl
#define int long long
using namespace std;
const int N = 1003;
const int M = (1 << 15) + 111;
const int mod = 1e9 + 7;
int f[3][M];
int n,m;
int state[M][5];
char s[N];
int g[17],gg[N];
int ans[17];
inline int calc(int st,char x){
int now = 0;
//printf("char:%c ",x);debugint(st);
for(int i = 1;i <= n;++i)
gg[i] = g[i] = g[i - 1] + ((st & (1 << (i - 1))) ? 1 : 0);
// printf("g:");
//for(int i = 1;i <= n;++i) printf("%d ",g[i]);puts("");
for(int i = 1;i <= n;++i){
if(x == s[i]) g[i] = gg[i - 1] + 1;
else g[i] = max(g[i],g[i - 1]);
now |= (g[i] - g[i - 1]) << (i - 1);
}
//printf("g:");for(int i = 1;i <= n;++i) printf("%d ",g[i]);puts("");
return now;
}
inline int count(int x){
int res = 0;
while(x){
if(x & 1) res++;
x >>= 1;
}
return res;
}
inline void up(int &x,int y){
x += y;
if(x >= mod) x -= mod;
}
signed main(){
int T;scanf("%d",&T);
while(T--){
memset(ans,0,sizeof(ans));
memset(f,0,sizeof(f));
scanf("%s",s + 1);
n = strlen(s + 1);
scanf("%d",&m);
for(int i = 0;i < (1 << n);++i){
state[i][1] = calc(i,'A');
state[i][2] = calc(i,'C');
state[i][3] = calc(i,'G');
state[i][4] = calc(i,'T');
}
f[0][0] = 1;
int now = 0;
for(int i = 0;i < m;++i){
memset(f[now ^ 1],0,sizeof(f[now ^ 1]));
for(int j = 0;j < (1 << n);++j){
for(int k = 1;k <= 4;++k)
up(f[now ^ 1][state[j][k]],f[now][j]);
}
now ^= 1;
}
for(int i = 0;i < (1 << n);++i) up(ans[count(i)],f[now][i]);
for(int i = 0;i <= n;++i) printf("%d\n",ans[i]);
}
return 0;
}

XHXJ’s LIS(HDU4352)

CF1043F

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

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

咕咕咕

ZR8.2 DP的更多相关文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  2. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  3. AEAI DP V3.7.0 发布,开源综合应用开发平台

    1  升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...

  4. AEAI DP V3.6.0 升级说明,开源综合应用开发平台

    AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  6. [斜率优化DP]【学习笔记】【更新中】

    参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  8. px、dp和sp,这些单位有什么区别?

    DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...

  9. android px转换为dip/dp

    /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...

随机推荐

  1. docker在windows下的安装

    Docker for Windows会默认包含两个引擎containers(linux和windows) 1. 下载Docker for Windows,https://docs.docker.com ...

  2. Hdu 1800 字符串hash

    题目链接 题意: 给出n(n<=3000)个字符串(长度<30,数字组成,肯能存在前导0), 问该序列最少可以分成多少个单调序列.可以转化成求相同字符串的个数的最大值 附上代码: /*** ...

  3. ajax封装最后形态

    function obj1(obj) { obj.t = new Date().getTime(); var res = []; for (var key in obj) //url中不能出现中文 r ...

  4. Maven中央存储库 和 如何从Maven远程存储库下载?

    当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默 ...

  5. Vue.js 第3章 axios&Vue过渡动画

    promise 它将我们从回调地狱中解脱出来 创建和使用 var fs = require('fs') // 创建promise // reslove表示执行成功后调用的回调函数 // reject表 ...

  6. 《C语言深度解剖》学习笔记之符号

    第2章 符号 1.注释符号 编译器会将注释剔除,用空格代替原来的注释 y=x /* p; 编译器提示出错的原因:实际上,编译器会把“/*”当作一段注释的开始,直到出现“*/”为止. [规则 2-1]注 ...

  7. JQuery------库

    JQuery-------------模块.类库 集成了DOM/BOM/JS的类库 一.查找元素 DOM 10左右 JQuery: 选择器: 筛选: ps:版本: 1.x:兼容性最好.1.12推荐 2 ...

  8. 4 文件操作 支持图片 视频 mp3 文本等

    #文件操作:send_file,支持图片 视频 mp3 文本等@app.route("/img")def img(): return send_file("1.jpg&q ...

  9. 【t065】最敏捷的机器人

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] [背景] Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ [问题描述] ...

  10. H3C PPP MP配置示例二(续)