Zhou_Zy's OI life.

来源:互联网 发布:日本教科书知乎 编辑:程序博客网 时间:2024/05/26 16:00

2016.8.02

今天完成的题目有:

  • codevs 1044 拦截导弹
  • codevs 3027 线段覆盖2
  • codevs 1068 乌龟棋

    三道都是DP题,最近打算把DP的经典模型全做一遍,然后再学点别的。

1.第一题的拦截导弹第一问还可以,第二问要用dilworth证明正确性,昨天本来想写篇博客来记录我所理解的dilworth定理,可无奈不小心把那篇博客删除了,事实上我也不是很搞得懂这个Dilworth的证明,记住结论就好了:在一组数中,最长不升子序列的数量等于最长上升子序列的长度。

2.第二问是有一道贪心题演变过来的,所以在做这道题的时候顺便用DP做了一下那道贪心题,并从中受益匪浅。像做其他区间相关问题类似的,我们先把它的右端点排序,然后像做序列问题那样,扫一遍,用v[i]来代表选到i这个区间时的最大价值。根据这个问题的定义可知这个问题满足最优子结构和无后效性,所以这个算法是正确的,在查找答案的时候呢,我开始一直以为v[n]就是最终答案,其实这是不对的,因为区间n不一定能被取到,说以v中的最大值才是最终答案。

3.一开始看到第三题的时候我直接懵了,钻石难度!!!但事实上并没有那么难,用一个4维数组来记录用了哪些棋子之后可以达到的最大值,状态转移方程是:f[i][j][k][l]=max(f[I-1][j][k][l],f[I][j-1][k][l],f[i][j][k-1][l],f[I][j][k][l-1],f[I][j][k][l])+s[I+j*2+k*3+l*4]。这里有一个细节需要注意:第一个棋子是有分数的!!!不要以为第一个棋子没有分数。

0 0
原创粉丝点击