插头dp [入土]
西江月·证明
即得易见平凡,仿照上例显然。
留作习题答案略,读者自证不难。
反之亦然同理,推论自然成立。
略去过程QED,由上可知证毕
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
long long dp[11][2048];
int w, h;
bool TFL(int ovo){
int i = 0;
while(i < w){
if(ovo & (0x1 << i)){
if(i == w - 1 or (ovo & (0x1 << (i + 1))) == 0) return 0;
i += 2;
}else i ++;
}return 1;
}
bool CT(int sa, int sb){//判断状态(i, sa)和(i-1, sb)是否兼容.(兼容性测试
int i = 0;
while(i < w){
if((sa & (0x1 << i)) == 0){
if((sb & (0x1 << i)) == 0) return 0;
i ++;
}
else{
if((sb & (0x1 << i)) == 0) i ++;
else if((i == w - 1) or !((sa & (0x1 << (i + 1))) and (sb & (0x1 << (i + 1))))) return 0;
else i += 2;
}
}
return 1;
}
int main(){
while(1){
cin >> h >> w;
if(h == 0 and w == 0) break;
if(w > h) swap(w, h); //H是大的 W是小的
int ovo = 2 << (w - 1);
memset(dp, 0, sizeof(dp));
for(int j = 0; j < ovo; j++) if(TFL(j)) dp[0][j] = 1;
for(int i = 1; i < h; i ++)
for(int j = 0; j < ovo; j ++) // iterate all status for line i
for(int k = 0; k < ovo; k ++) // iterate all status for line i-1
if(CT(j, k)) dp[i][j] += dp[i - 1][k];
printf("%lld\n", dp[h - 1][ovo - 1]);
}
return 0;
}
QED
而我们终其一生,都希望能成为更好的人。
本文作者:hulne
本文链接:https://www.cnblogs.com/moziii/p/13363314.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步