生活随笔
收集整理的這篇文章主要介紹了
hihoder 1048
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#1048 : 狀態(tài)壓縮·二
時間限制:
10000ms 單點時限:
1000ms 內存限制:
256MB 描述
歷經千辛萬苦,小Hi和小Ho終于到達了舉辦美食節(jié)的城市!雖然人山人海,但小Hi和小Ho仍然抑制不住興奮之情,他們放下行李便投入到了美食節(jié)的活動當中。美食節(jié)的各個攤位上各自有著非常多的有意思的小游戲,其中一個便是這樣子的:
小Hi和小Ho領到了一個大小為N*M的長方形盤子,他們可以用這個盒子來裝一些大小為2*1的蛋糕。但是根據要求,他們一定要將這個盤子裝的滿滿的,一點縫隙也不能留下來,才能夠將這些蛋糕帶走。
這么簡單的問題自然難不倒小Hi和小Ho,于是他們很快的就拿著蛋糕離開了~
但小Ho卻不只滿足于此,于是他提出了一個問題——他們有多少種方案來裝滿這個N*M的盤子呢?
值得注意的是,這個長方形盤子的上下左右是有區(qū)別的,如在N=4, M=3的時候,下面的兩種方案被視為不同的兩種方案哦!
提示:我們來玩拼圖吧!不過不同的枚舉方式會導致不同的結果哦!
輸入
每個測試點(輸入文件)有且僅有一組測試數據。
每組測試數據的第一行為兩個正整數N、M,表示小Hi和小Ho拿到的盤子的大小。
對于100%的數據,滿足2<=N<=1000, 3<=m<=5。<>
輸出
考慮到總的方案數可能非常大,只需要輸出方案數除以1000000007的余數。
樣例輸入
2 4
樣例輸出
5
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
#include<bitset>#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)#define bug(msg) cout << msg << endl;using namespace std;
#define mod 1000000007
#define eps 1e-8
#define N 1005
#define M 6int dp[N][1<<M];
int ans[N][M];
int n,m;inline bool check(int pre, int cur)
{int len = (1 << m) - 1;if ((pre | cur) != len)return false;for (int i = 0; i < m;){if (cur & (1 << i)){if (!(pre & (1 << i))){i++;continue;}else{if (!(pre & (1 << (i+1)))) return false;if (!(cur & (1 << (i+1)))) return false;i+=2;continue;}}else{if (!(pre & (1 << i)))return false;i++;}}return true;
}int dfs(int pos, int preStatus)
{if (pos == n + 1)return preStatus == (1 << m) - 1 ? 1 : 0;if (dp[pos][preStatus] != -1)return dp[pos][preStatus];int ans = 0;for (int curStatus = 0; curStatus < (1<<m); curStatus++){if (check(preStatus, curStatus))ans = (ans + dfs(pos + 1, curStatus)) % mod;}return dp[pos][preStatus] = ans;
}int solve()
{memset(dp, -1, sizeof(dp));dp[0][(1<<m) - 1] = 0;return dfs(1, (1 << m) - 1);
}int main()
{memset(ans, -1, sizeof(ans));while (~scanf("%d%d", &n, &m)){if (ans[n][m]!= -1)cout << ans[n][m] << endl;elsecout << (ans[n][m] = solve()) << endl;}return 0;
}
總結
以上是生活随笔為你收集整理的hihoder 1048的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。