2016XTU算法专题个人赛4 题解
A. HDU 3664 Permutation Counting
题意: 给你一个{1, 2, …, N} 的排列
a1,a2,…aN
,我们定义这个排列的E值为其中
ai>i
的元素的数量。请你找出{1, 2, …, N} 有多少个E值为k的排列(对1,000,000,007.取模)。
解法:
dp[i][j]
表示 前i个数组成的排列中E值为j的排列的个数。考虑从一个{1, 2, …, n - 1} 的排列向{1, 2, …, n}的排列的状态转移。考虑新增的数字i的位置:
- 可以放在第n个位置,这样不改变原排列的E值,即 dp[i][j] 包含 dp[i−1][j] 的情况;
- 还可以放在位置
x(1<x<n)
的位置,将原来位置x上的数字换到第n个位置上。这时考虑
ax
与
x
的关系:
ax>x ,被换到位置n则E值-1,n放入x位置则E值+1,故E值不变。对于 dp[i−1][j] ,这样的x有j个,则 dp[i][j] 还包含 dp[i−1][j]∗j 个情况;- ax≤x ,被换到位置n则E值不变,n放入x位置则E值+1,故E值+1。对于对于 dp[i−1][j] ,这样的x有 (i−1)−(j−1)=i−j 个,则 dp[i][j] 还包含 dp[i−1][j−1]∗(i−j) 个情况。
综上
dp[i][j]={dp[i−1][j]dp[i−1][j]∗(j+1)+dp[i−1][j−1]∗(i−j)(j=0)(0<j≤i)
B. HDU 5532 Almost Sorted Array
题意: 给一个数组,判断是否可以在删除一个元素之后,剩下的数组元素有序。
解法:
用 NlogN 的算法求原数组的最长非增子序列和最长非减子序列,有结果大于等于原数组长度-1,则符合题意。(参考 NlogN 的最长上升子序列解法)
C. HDU 5763 Another Meaning
题意: 类似于:只由小写字母构成的字符串A中的子串B可以被替换成*,问A可以生成多少个字符串。
解法: 对于每一个A的子串,如果其等于B,则有换成*和不换成*两种情况。设 dp[i] 为A串前i个字母组成的字符串可以替换生成的字符串数量,m为字符串B的长度。如果A从第(i-m+1)到第m个字母组成的子串与B相等,若将其替换,则生成的字符串数量等于A的前i-m个字母组成的字符串生成的数量;若不替换,则等于前i-1的串生成的数量,即 dp[i]=dp[i−m]+dp[i−1] 。由于数据比较水,字符串匹配时strncmp之类方法就能解决,正解应该是用kmp或者hash判断。
综上
dp[i]={dp[i−1]+dp[i−m]dp[i−1](A.substr(i−|B|+1,|B|)=B)(other)
D. HDU 3339 In Action
题意: 要破坏掉一个电网, 有n个电站编号为1~n,每个电站有它自己的能量值。有一个军事基地编号为0,里面有无限个坦克,可以开到某个电站轰炸破坏掉电站,并且一个坦克只能破坏一个。现在要破坏掉其中一些电站,要让电网的总能量值损失一半以上, 并且要让所有执行任务的坦克去目的地路费最少。
解法:- 容易想到用单源最短路算法求出0到所有其他点的最短距离。
- 关键是要选择破坏哪些电站,使得这些破坏的电站总能量值为原来的一半以上。
因为对于每一个电站,要么是选择破坏,要么是不破坏,那么便可以联想到经典的01背包问题。
把求得的最短距离总和当作背包容量, 各个站的能量值当作物品价值,然后OK。
E. HDU 1712 ACboy needs your help
题意: 有N门课,花费M天。不同课程的收益取决于在它上花费的时间。怎样为N门课程安排M天让总收益最大化?
解法:lxdd说太水了不用写题解了……分组背包模板题,下图摘自背包九讲。