zoukankan      html  css  js  c++  java
  • P2051 [AHOI2009]中国象棋

    题目链接

    P2051 [AHOI2009]中国象棋

    思路

    • (30pts:)

    显然枚举每一行来放即可

    • (50pts:)

    尝试优化(30)分的方法

    显然对于(30)分来说,每行枚举的情况就(3)种,放(0)个炮,(1)个炮,(2)个炮(再多放就不合法了)

    来分析(瞎逼逼一波)一下为毛它很慢

    更为显然的是它在以前的状态转移时有重新计算了一遍,有点(sb),于是乎我们可以记忆化

    (f[i][j]) 表示放到第(i)行,当前第(i)行的状态是(j)(j)是三进制压缩,然后枚举转移

    • (100pts:)

    观察一下(50)分做法

    显然对于一个位置(1)个炮的转移时唯一的(从零个变一个)

    对于两个炮的转移也是唯一的(从一个变两个)

    那么我们需要记录的状态仅仅时(1)个炮和(0)个炮即可,没必要记录(2)个炮(反正它也不转移)

    (f[i][j][k])表示到第(i)行,有(j)个放了一个的,有(k)个放了(0)个的

    转移就是先判断状态能不能到达,然后再枚举从那个转移

    初始化时把(f[0][0][m])设成(1),然后用组合数统计

    • 总结

    总体而言,这道题利用了炮的性质(好像大部分的中国象棋类题目都是如此)

    其中关键在于按照行(列)来设立状态并且能以试到每行(列)最多(2)个炮(就是炮的性质)

  • 相关阅读:
    循环神经网络(Recurrent Neural Network)
    特征选择
    程序猿能挣多少钱
    python socket
    python 2 encode and decode
    pandas series
    source collection list
    pep8摘要
    python 正则表达式
    django显示图片
  • 原文地址:https://www.cnblogs.com/pyyyyyy/p/12298344.html
Copyright © 2011-2022 走看看