2016XTU算法专题个人赛4 题解

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[i1][j] 的情况;
  • 还可以放在位置 x(1<x<n) 的位置,将原来位置x上的数字换到第n个位置上。这时考虑 ax x 的关系:
    • ax>x ,被换到位置n则E值-1,n放入x位置则E值+1,故E值不变。对于 dp[i1][j] ,这样的x有j个,则 dp[i][j] 还包含 dp[i1][j]j 个情况;
    • axx ,被换到位置n则E值不变,n放入x位置则E值+1,故E值+1。对于对于 dp[i1][j] ,这样的x有 (i1)(j1)=ij 个,则 dp[i][j] 还包含 dp[i1][j1](ij) 个情况。

综上

dp[i][j]={dp[i1][j]dp[i1][j](j+1)+dp[i1][j1](ij)(j=0)(0<ji)

参考代码链接


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[im]+dp[i1] 。由于数据比较水,字符串匹配时strncmp之类方法就能解决,正解应该是用kmp或者hash判断。

综上

dp[i]={dp[i1]+dp[im]dp[i1](A.substr(i­|B|+1,|B|)=B)(other)

参考代码链接


D. HDU 3339 In Action

题意: 要破坏掉一个电网, 有n个电站编号为1~n,每个电站有它自己的能量值。有一个军事基地编号为0,里面有无限个坦克,可以开到某个电站轰炸破坏掉电站,并且一个坦克只能破坏一个。现在要破坏掉其中一些电站,要让电网的总能量值损失一半以上, 并且要让所有执行任务的坦克去目的地路费最少。
解法:

  1. 容易想到用单源最短路算法求出0到所有其他点的最短距离。
  2. 关键是要选择破坏哪些电站,使得这些破坏的电站总能量值为原来的一半以上。
    因为对于每一个电站,要么是选择破坏,要么是不破坏,那么便可以联想到经典的01背包问题。
    把求得的最短距离总和当作背包容量, 各个站的能量值当作物品价值,然后OK。

以上题解来源


E. HDU 1712 ACboy needs your help

题意: 有N门课,花费M天。不同课程的收益取决于在它上花费的时间。怎样为N门课程安排M天让总收益最大化?
解法: lxdd说太水了不用写题解了……分组背包模板题,下图摘自背包九讲。
2016XTU算法专题个人赛4 题解_第1张图片

参考代码链接(写得有点搓,还是按上图写吧)

你可能感兴趣的:(动态规划)