例题6.1 铺放骨牌 UVa11270

1.题目描述:点击打开链接

2.解题思路:本题是最基础的轮廓线动态规划问题。这类问题的特点是无法用传统的整行整列作为状态进行dp,只能把参差不齐的轮廓线当做状态的一部分来进行转移。下面以这道题为例来谈一谈这种做法。

首先,我们需要回顾一下多阶段决策的dp问题,这类问题的解法通常是:把边界情况的dp值都设置为1,然后从小到大枚举每个阶段,在上一个阶段中的每个点j,和j的每个后继结点k,有d[cur][k]+=d[1-cur][j];其中d[cur]就是当前正在计算的阶段。本题实质上也是多阶段的决策问题,只不过需要用轮廓线来描述每个阶段。

为了降低时间复杂度,我们总是让m作为n,m中的较小者。接下来,我们按照从上到下,从左到右的顺序把棋盘划分成若干个阶段,每个阶段都有2^m个结点,其中的每个结点都用一个m位的二进制数来表示,每一位中,1表示覆盖,0表示未覆盖。阶段的决策是“以当前格子为右下角,要不要放置骨牌以及放置哪种骨牌”,这样,就有3种情况:

(1)不放,此时当前格子的上方格子必须为1,否则该决策不可行;

(2)竖放,此时当前格子不能为第一行,且当前格子的上方格子必须为0;

(3)横放,此时当前格子不能为第一列,且当前格子的上方为1,左侧为0;

这三种情况都可以用位运算加以实

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值