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说太水了不用写题解了……分组背包模板题,下图摘自背包九讲
    背包九讲 6 分组背包

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值