编程之美4.2 瓷砖覆盖


用1*2的瓷砖覆盖N*M的地面。
这是一道 状态变换的动态规划
考察地面的i行,如果j列上有瓷砖就设(i,j)为1,如果没有瓷砖就设为0。设为0就表示要在(i,j)和(i+1,j)铺竖瓷砖。
则最后一行必须全是1。因此可以设一个数组dp[N][2^M-1]记录每一行每种状态的铺法。dp[i][j]为dp[i-1]行中所有可行状态的铺法之和。

剩下的问题就是考察可行状态:
对i(i不等于1)行的每个格子考察i-1行的状态:
如果(i,j)=0,那么(i-1,j)一定是1。如果满足,就考察(i,j+1)
如果(i,j)=1,有两种情况:
(i-1,j) = 0,表示(i-1,j)是竖着铺的,下一步考察(i,j+1)
(i-1,j) = 1,则表示(i,j)必须是横着铺,那么(i,j+1)一定是1,并且(i-1,j+1)也一定是1(否则(i,j+1)就是竖着铺了),如果满足就考察(i,j+2)

对于第一行(i=1),要考察每种状态的可行性,如果可行dp[i][j] = 1,如果不可行dp[i][j] = 0。
如果(i,j) = 1那么(i,j+1)也一定是1,然后考察(i,j+2);
如果(i,j) = 0,直接考察(i,j+1)

dp[N][2^M-1]就是最后的结果


#include  <stdio.h>
#define  MAX 3000
#define  ROW 12
__int64  dp[ROW][MAX];
int  h,w;
int  maxw;
int  power( int  two,  int  n)
{
                  if  (two == 0)
                                  return  0;
                  if</
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值