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)个炮(就是炮的性质)

  • 相关阅读:
    IIS7配置URL Rewrite链接重写
    wordpress导航菜单的链接支持弹出新页面
    c++绝对是拯救了世界,特别是程序员
    Linux 磁盘坏道检测和修复
    centos里mysql无法用localhost连接的解决方法
    php扩展开发
    IP多播
    因特网的路由选择协议
    ICMP协议
    ARP协议
  • 原文地址:https://www.cnblogs.com/pyyyyyy/p/12298344.html
Copyright © 2011-2022 走看看