20220728 - DP训练 #1

时间记录

  1. \(8:00-9:00\) T1

    尝试做 \(T1\),可惜并未做出,没有想到是资源分配

    设置三维状态,初值一直不知道怎么设置

    并且对于距离有一部分不会进行状态转移

    也尝试过二维状态,没有成功

  2. \(9:00-9:30\) T3

    直接看出部分分做法,搜索遍历整棵树即可,\(40\) 分

  3. \(9:30-10:00\) T2

    看到 \(30\) 分数据中 \(n \leq 10\),于是进行打表,成功得分

    在手推过程中好像发现了一点规律,但不清晰

    也不清楚到底是什么规律而且没有时间再次推导

最终成绩——前 \(38\%\)

T1 T2 T3
0 30 40

写的部分分全部拿到,但是感觉 \(T1\) 不难,可惜写不出来

本次模拟赛来的突然,拿到题目没有先浏览全部题面,直接做 \(T1\),最终时间安排不当

T1-Marathon S Luogu P2849 [USACO14DEC]

题目描述

由于对他的奶牛的健康状况不佳而感到不满,牧场主约翰让它们参加各种各样的体育健身活动。最让他感到自豪的奶牛是 Bessie,她将参加约翰牧场附近城市里的马拉松比赛!

马拉松比赛有 \(N\) 个检查点 \((3\leq N\leq 500)\) ,需要按顺序访问。检查点 \(1\) 是起点,检查点 \(N\) 是终点。Bessie 应该按顺序一一访问所有的这些检查点,但由于她是一头懒惰的牛(懒惰竟然还选择跑马拉松!),于是她决定跳过 \(K(K<N)\) 个检查点以缩小她的赛程。但她不能跳过第 \(1\) 个和第 \(N\) 个检查点,因为这样太明显了。

请你帮助 Bessie 计算出跳过中间的 \(K\) 个检查点后她最少要跑多少距离。

注意:由于街道是网格状的,我们用坐标来表示点的位置。但是 \((x_1,y_1),(x_2,y_2)\) 两点间的距离应为 \(|x_1-x_2|+|y_1-y_2|\),这种测量距离的方法被称为“曼哈顿”距离,这是因为在市中心的网格路中,你可以沿平行于 \(x\) 轴或 \(y\) 轴的方向走,但不能沿直线到达。

输入格式

第一行:两个正整数 \(N\) 和 \(K\)。

第 \(2\) 行到第 \(N+1\) 行,每行两个整数\(x,y (-1000\leq x\leq 1000,-1000\leq y\leq 1000)\)。

这里给出了检查点的顺序,她必须按顺序访问。注意:可能会有几个检查点出现在同一位置,Bessie 跳过这样的检查点时,相当于只跳过其中的一个检查点。

输出格式

输出跳过某一个检查点后 Bessie 可以跑的最短距离。

Bessie 参加城市马拉松比赛,要顺序经过 \(N (3 \leq N \leq 500)\) 个检查点,其中检查点 \(1\) 是起点,检查点 \(N\) 是终点。 Bessie尝试略过 \(K(K < N)\) 个检查点,以减少总路程,检查点 \(1\) 和检查点 \(N\) 不能被略过。两个检查点的距离是 \(|x_1-x_2| + |y_1-y_2|\)。

输入输出格式

样例

input

5 2
0 0
8 3
1 1
10 -5
2 2

output

4

资源分配类DP,套用模板稍加变化即可解决。

需要单独处理一下路径计算

int dis(int i,int j)
{
return abs(x[i]-x[j])+abs(y[i]-y[j]);
}

状态:\(f[i][j]\):前 \(i\) 个检查点,跳过了 \(j\) 个的最短路径

状态转移:\(f[i][j]=min(f[i][j],f[i-l-1][j-l]+dis(i-l-1,i))\)

f[1][0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=min(i-1,k);j++)
for(int l=0;l<=j;l++)
f[i][j]=min(f[i][j],f[i-l-1][j-l]+dis(i-l-1,i));
printf("%d\n",f[n][k]);

T2-梦境

题目描述

GTW 做了一个梦。这个梦是这样的,GTW 是一个财主,有一个仆人在为 GTW 打工。

不幸的是,又到了月末,到了给仆人发工资的时间。

但这个仆人很奇怪,它可能想要至少 \(x\) 块钱,并且当GTW 凑不出恰好 \(x\) 块钱时,它不会找零钱给 GTW。

GTW 知道这个 \(x\) 一定是 \(1 \sim n\) 之间的正整数。当然抠门的 GTW 只想付给它的仆人恰好 \(x\) 块钱。

但GTW 只有若干的金币,每个金币都价值一定数量的钱

(注意任意两枚金币所代表的钱一定是不同的,且这个钱的个数一定是正整数)。

GTW 想带最少的金币,使得对于任意 \(x\),都能恰好拼出这么多钱。

并且 GTW 想知道有多少携带金币的方案总数。 具体可以看样例。

输入格式

第一行一个数 \(n\),如题意所示。

输出格式

输出两个数,第一个数表示GTW 至少携带的金币个数,第二数表示方案总数。

输入样例1

6

输出样例1

3 2

样例解释1

GTW 需要至少带 \(3\) 枚金币,有两种方案,分别是 \(\{1,2,3\}\),\(\{1,2,4\}\) 来恰好得到任意的 \(1 \sim n\) 之间的 \(x\) 。

输入样例2

10

输出样例2

4 8

数据范围

对于 \(30\%\) 的数据 \(n\leq 10\) 。

对于 \(60\%\) 的数据 \(n\leq 100\) 。

对于 \(100\%\) 的数据 \(n \leq 1000\) 。

经过举例子,打表分析可得:\(m\) 的最小值为 $\lceil \log_2 n+1 \rceil $

int t=log2(n)+1;

那么问题变为如何统计方案数

利用 DP思想,可得如下状态:

状态:\(f[i][j][k]\):用了 \(i\) 枚硬币,最大的面值为 \(j\),总和为 \(k\) 的方案数

由此,我们可以枚举第 \(i+1\) 枚硬币面值为 \(l\),因为硬币面值各不相同

且硬币从小到大枚举,要保证能够拼出 \(1 \sim n\),所以 \(j<t \leq k+1\)

状态转移:\(f[i+1][l][min(k+l,n)]+=f[i][j][k]\)

f[1][1][1]=1;
for(int i=1;i<=t;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(f[i][j][k])
for(int l=j+1;l<=k+1;l++)
f[i+1][l][min(k+l,n)]+=f[i][j][k];

最终统计用了 \(t\) 枚硬币,总和为 \(n\) 的方案数之和即可

for(int j=1;j<=n;j++)
ans+=f[t][j][n];
printf("%d %d\n",t,ans);

T3-树上距离

懒惰的温温今天上班也在偷懒。盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 \(n\) 个节点的树。

一棵 \(n\) 个节点的树包含 \(n-1\) 条边,且 \(n\) 个节点是联通的。

树上两点之间的距离即两点之间的最短路径包含的边数。

突发奇想的温温想要知道, 树上有多少个不同的点对, 满足两点之间的距离恰好等于 \(k\) 。

注意:\((u, v)\) 和 \((v, u)\) 视作同一个点对,只计算一次答案。

Input

第一行两个整数 \(n\) 和 \(k\) 。

接下来 \(n-1\) 行每行两个整数 \(a_i, b_i\),表示节点 \(a_i\) 和 \(b_i\) 之间存在一条边。

$1 \leq k \leq 500 $

\(2 \leq n \leq 500\) for $40% $

\(2 \leq n \leq 50000\) for $100% $

Output

输出一个整数,表示满足条件的点对数量。

Examples

input
5 2
1 2
2 3
3 4
2 5
output
4
input
5 3
1 2
2 3
3 4
4 5
output
2

根据题意,首先建树,从根节点 \(1\) 开始遍历,可设如下状态:

状态:\(f[x][j]\):以 \(x\) 为根节点,距 \(x\) 距离为 \(j\) 的节点个数

假设有一节点 \(x\) 的儿子节点为 \(y\)

则距节点 \(y\) 距离为 \(j\) 的节点,距 \(x\) 的距离为 \(j+1\),由此得到转移方程:

状态转移:\(f[x][j+1]+=f[y][j],\ y\in Son(x)\)

for(int j=0;j<=k;j++)
f[x][j+1]+=f[y][j];

对于统计答案:

假设有一节点 \(x\) 的儿子节点为 \(y\),枚举距离 \(j \in [0,k]\)

距节点 \(y\) 距离为 \(j\) 的节点,距 \(x\) 的距离为 \(k-j-1\)

满足这种情况的节点符合题意

利用乘法原理,将两数相乘即可

for(int j=0;j<=k;j++)
ans+=f[x][k-j-1]*f[y][j];

最后输出 \(ans\) 。

20220728 - DP训练 #1的更多相关文章

  1. 20220729 - DP训练 #2

    20220729 - DP训练 #2 时间记录 \(8:00-8:10\) 浏览题面 \(8:10-8:50\) T1 看题想到了建树,从每一个点遍历,若能遍历每一个点,则可以获胜 快速写完之后,发现 ...

  2. dp训练

    根据这位大佬的https://www.cnblogs.com/Bunnycxk/p/7360183.html 题目链接:https://www.luogu.org/problemnew/show/P3 ...

  3. 8.8&8.9 dp训练小结

    写了两天的dp题,表示大多dp都不会啊,还是爆搜大法好.我真的太蒻了dp还是要多做题啊,一些基本的套路还是不熟,真正写对的dp也就一道,还一道爆搜过的,dp还有很深的坑要填啊.. 8.8 T1 质数和 ...

  4. 区间DP训练

    一.石子合并 问题描述 将 n (\(1 \le n \le 200\))堆石子绕圆形操场摆放,现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并 ...

  5. Column Addition~DP(脑子抽了,当时没有想到)

    Description A multi-digit column addition is a formula on adding two integers written like this:

  6. hdu2089数位DP

    旁听途说这个名字很久了,了解了一下. 改题目的意思是给你若干区间,让你找寻区间内不含62或4的数. 首先暴力必然T...那么实际上就是说,想办法做一种预处理,在每次输入的时候取值运算就可以了. 既然是 ...

  7. 初学dp心得

    从STL到贪心,再到现在的动态规划,可以说动态规划真的让我学的有点蒙,对于一些题目,会做,但是不会用DP,现在还不能熟练的写出状态转移方程,更重要的是,自己宛如一个哺乳期的小孩,做题需要套模板,没有模 ...

  8. dp (1)

    D - Tree of Tree ZOJ - 3201 这个题目我开始是这么定义的dp[i][j][0] dp[i][j][1] 表示对于第i个节点还有j个的选择 0 代表不选这个节点,1 代表选这个 ...

  9. ML2021 | (腾讯)PatrickStar:通过基于块的内存管理实现预训练模型的并行训练

    ​  前言  目前比较常见的并行训练是数据并行,这是基于模型能够在一个GPU上存储的前提,而当这个前提无法满足时,则需要将模型放在多个GPU上.现有的一些模型并行方案仍存在许多问题,本文提出了一种名为 ...

随机推荐

  1. WPF 截图控件之画笔(八)「仿微信」

    前言 接着上周写的截图控件继续更新添加 画笔. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...

  2. 技术分享 | 在MySQL对于批量更新操作的一种优化方式

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 作者:景云丽.卢浩.宋源栋 GreatSQL社区原创内容未经授权不得随意使用,转 ...

  3. 产品 | GreatSQL,打造更好的MGR生态

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 用 ...

  4. 开源风吹动开源心 ~ 8月16日,你若来,我们(Apache)在等你!

    点击上方蓝字关注ALC Beijing 抢! 太好看了吧! 买它,就是它,买它! 要抢! ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组. ...

  5. 用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑

    大家好,又见面了. 今天我们一起聊一聊JAVA中的函数式接口.那我们首先要知道啥是函数式接口.它和JAVA中普通的接口有啥区别?其实函数式接口也是一个Interface类,是一种比较特殊的接口类,这个 ...

  6. 稳定好用的短连接生成平台,支持API批量生成

    ​ https://www.5w.fit/ 01 安全:快码拥有两种模式:防封模式和极速模式,防封模式使短链更加安全! 02 无流量劫持:快码短链绝不劫持流量! 03 极速:专属大量服务器,支持高并发 ...

  7. HC32L110 系列 M0 MCU 的介绍和Win10下DAP-Link, ST-Link, J-Link的烧录

    HC32L110 系列 Cortex M0 MCU Hackaday 在三月份的时候介绍了一款最小的MCU NEW PART DAY: SMALLEST ARM MCU UPROOTS COMPETI ...

  8. mongo数据库-mongo角色权限

    Built-In Roles(内置角色): 1. 数据库用户角色:read.readWrite; 2. 数据库管理角色:dbAdmin.dbOwner.userAdmin: 3. 集群管理角色:clu ...

  9. Redis技术

    Redis技术 Redis 简介 Redis 是一个 key-value 的 nosql 产品,存储的 value 类型更加丰富,包括 string(字符串), list(链表),set(集合),zs ...

  10. 美丽的神话 flac 成龙/金喜善 美丽的神话 mp3 韩红/孙楠

    这里分享从网上收集的俩个版本的歌,都很不错,有兴趣的可以听听 以下是成龙/金喜善 flac 版本,音质不错: 美丽的神话成龙/金喜善解开我最神秘的等待星星坠落风在吹动终于再将你融入怀中两颗心颤抖相信我 ...