已经没办法再简单的状压dp入门练习

题目:
有一个N*M(N<=5,M<=1000)的棋盘,现在有1*2及2*1的小木块无数个,要盖满整个棋盘,有多少种方式?答案只需要mod1,000,000,007即可。

例如:对于一个2*2的棋盘,有两种方法,一种是使用2个1*2的,一种是使用2个2*1的。
分析:此题由于N比较小,所以可以通过状态压缩,去搜索每一个状态,然后根据前一列对后一列的影响,这样我们只要求出第m+1列状态为0的情况的个数,就是正解

accode:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 100;
const int mod = 1e9 + 7;
int T, n, m;
ll dp[1005][(1 << 5) + 5];
void dfs(int i, int j, int state, int nex) {
    if (j == n) {
        dp[i + 1][nex] += dp[i][state];
        //cout << i + 1 << " " << nex << " " << dp[i + 1][nex]<<endl;
        dp[i + 1][nex] = dp[i + 1][nex] % mod;
        return;
    }
    if ((state&(1 << (j))) >0) {
        dfs(i, j + 1, state, nex);
    }
    if ((state&(1 << (j))) == 0) {
        dfs(i, j + 1, state, (nex | (1 << (j))));
    }
    if ((state&(1 << (j))) == 0 && (j + 1<n) && ((state&(1 <<( j + 1))) == 0)) {
        dfs(i, j + 2, state, nex);
    }
}
int main()
{
    memset(dp, 0, sizeof(dp));
    scanf("%d%d", &n, &m);
    dp[1][0] = 1;
    //int t = (3 & (1 << (1)));
    //cout <<t << endl;
    for (int i = 1; i <= m; i++) {
        for (int j = 0; j <(1 << (n)); j++) {
            dfs(i, 0, j, 0);
        }
    }
    cout << dp[m + 1][0] << endl;
    return 0;
}
全部评论

相关推荐

03-19 10:36
云南大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24501次浏览 482人参与
# 中国电信笔试 #
31011次浏览 283人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14056次浏览 209人参与
# 你的实习产出是真实的还是包装的? #
18681次浏览 329人参与
# 如果秋招能重来,我会____ #
96616次浏览 500人参与
# 春招至今,你的战绩如何? #
59439次浏览 535人参与
# 厦门银行科技岗值不值得投 #
7435次浏览 186人参与
# i人适合做什么工作 #
36838次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79444次浏览 219人参与
# 哪些公司真双非友好? #
69176次浏览 287人参与
# 找AI工作可以去哪些公司? #
7587次浏览 181人参与
# 从事AI岗需要掌握哪些技术栈? #
7563次浏览 240人参与
# 面试尴尬现场 #
220729次浏览 861人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339810次浏览 2165人参与
# 五一之后,实习真的很难找吗? #
102792次浏览 584人参与
# 金三银四,你的春招进行到哪个阶段了? #
21492次浏览 275人参与
# 你做过最难的笔试是哪家公司 #
29779次浏览 184人参与
# 你小时候最想从事什么职业 #
159832次浏览 2072人参与
# 阿里笔试 #
176154次浏览 1301人参与
# 应届生第一份工资要多少合适 #
20463次浏览 84人参与
# 一张图晒出你司的标语 #
3787次浏览 71人参与
# 面试被问期望薪资时该如何回答 #
382448次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务