日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hihoder 1048

發布時間:2023/12/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hihoder 1048 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#1048 : 狀態壓縮·二

時間限制:10000ms 單點時限:1000ms 內存限制:256MB

描述

歷經千辛萬苦,小Hi和小Ho終于到達了舉辦美食節的城市!雖然人山人海,但小Hi和小Ho仍然抑制不住興奮之情,他們放下行李便投入到了美食節的活動當中。美食節的各個攤位上各自有著非常多的有意思的小游戲,其中一個便是這樣子的:

小Hi和小Ho領到了一個大小為N*M的長方形盤子,他們可以用這個盒子來裝一些大小為2*1的蛋糕。但是根據要求,他們一定要將這個盤子裝的滿滿的,一點縫隙也不能留下來,才能夠將這些蛋糕帶走。

這么簡單的問題自然難不倒小Hi和小Ho,于是他們很快的就拿著蛋糕離開了~

但小Ho卻不只滿足于此,于是他提出了一個問題——他們有多少種方案來裝滿這個N*M的盤子呢?

值得注意的是,這個長方形盤子的上下左右是有區別的,如在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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。