【训练日记】20170328

【训练日记】20170328

今天的题目似乎很水……?好多人都提前AK离场了,于是提前一小时收题。
但是我还是各种不会。
思维江化???
话说,听到一句很有趣的话:
山不在高,有林则徐;水不在深,有江……

T1

题意:给定一棵有 N(N105) 个节点的有根树,编号互不重复。询问有多少棵子树内节点编号构成一个连续区间。

题解:水题,对于每个节点 i ,记录以该节点为根的子树中最大和最小节点的编号Max(i)Min(i)以及子树的节点个数 Weight(i) ,若该子树内节点编号构成连续区间,则 Max(i)Min(i)=Weight(i)1

开场秒掉一题,开开心心对拍完,然后就开始了噩梦……

T2

题意:对于一个 1n(n1001) 的排列,定义一种表示方式。若排列中相邻两个元素后面一个大于前面,用 I 表示;若前面大于后面,用D表示。如排列 3,1,2,7,4,6,5 可以表示为 DIIDID 。现给出一个长度为 n1 的排列表示,问有多少种排列满足这种表示。排列由 ID? 组成, ? 表示该位置既可以是I,也可以是 D

题解:考虑动态规划。用f[i][j]表示排列的第 i 位在in1位中是第 j 小的数的情况的排列数。若字符串的第i1位为 I ,则f[i][j]=Σjk=1f[i1][k] D ?同理。观察发现该转移方程可以用前缀和优化,实现 O(1) 转移。

似乎很水的一道题,但是考场上完全没有思路。DP经验还是不足啊。

T3

题意:给定两个字符串 XY(1|X|,|Y|1000) 。令 L X Y 的最长公共子序列长度,询问X的所有长为 L 的子序列中,有多少个也是Y的子序列。

题解:再次考虑动态规划。首先 O(n2) 预处理出 dp 数组,其中 dp[i][j] 表示 X 串长为i的前缀与 Y 串长为j的前缀的最长公共子序列长度。转移方程:

dp[i][j]={max(dp[i1][j1],dp[i1][j],dp[i][j1])max(dp[i1][j],dp[i][j1])X[i] = Y[j]X[i]Y[j]

(似乎这样写很丑……)
接着用 dp 数组计算 f 数组。f[i][j]表示 X 串长为i的前缀中,长度恰好为 dp[i][j] 的子序列,且同时也是 Y 串长为j的前缀的子序列的个数。记 p[i] Y 串中第i个字符,在它之前与它相同的字符的最大下标。

f[i][j]+={f[i1][p[j]1]f[i1][j1]X[i] = Y[j],dp[i][j] = dp[i - 1][p[j] - 1] + 1dp[i][j] = dp[i - 1][j - 1]

f[|X|][|Y|] 即为答案。

思维难度略高于上题……考场上完全想歪了Orz。
日常训练无限垫底,要振作起来啊。
稻花香里说丰年,听取WA声一片。老老实实写小暴力、对拍!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值