榪欎釜棰樼洰鍘誨勾灝辮繃浜嗭紝鐢ㄥ緱鏄姸鎬佸帇緙ヾp錛屼笉榪囨病鐢╠fs棰勫鐞嗭紝褰撴椂鍋氬緱涓嶆槸寰堟槑鐧斤紝榪樻槸鍙傝冪綉涓婄殑涓涓唬鐮佸仛鐨勩?br>鐜板湪閲嶆柊鍋氫簡涓涓嬭繖涓鐩紝璇鋒暀浜唅cecream錛屽浼氫簡涓涓緢綆緇冪殑鍋氭硶錛岃屼笖姣旇緝濂界悊瑙h繕濂藉啓銆?br>棣栧厛榪樻槸鐘舵佺殑琛ㄧず錛岀敤0琛ㄧず娌℃湁鏀炬湪鍧楋紝鐢?琛ㄧず鏀句簡鏈ㄥ潡銆傛澶栵紝瀵逛簬涓涓í鏀劇殑鏈ㄥ潡錛屽搴旂殑涓や綅閮界敤1琛ㄧず錛涘浜庝竴涓珫鏀劇殑鏈ㄥ潡錛岀涓琛岀敤1琛ㄧず錛岀浜岃鐢?琛ㄧず銆傝繖鍙槸涓縐嶈鐘舵佺殑鏂瑰紡錛屽綋鐒惰繕鏈夊埆鐨勮娉曪紝浣嗘槸榪欑鏂規(guī)硶鍦ㄦ帴涓嬫潵灝變細鍙戠幇浼樼偣銆?/p>
鐘舵佽〃紺哄畬灝辮澶勭悊杞Щ浜嗭紝濡備綍鍒ゆ柇涓涓漿縐繪槸鍚﹀悎娉曟瘮杈冮毦鍔烇紝鐢ㄤ竴涓猟fs鍗村彲浠ョ畝媧佺殑瑙e喅榪欎釜闂銆?br>瀵逛簬涓婁竴琛屽埌涓嬩竴琛岀殑杞Щ錛岃瀹氫笂涓琛屼竴瀹氬~婊★紝榪欐牱鏈変笁縐嶆柟寮忥細
dfs(col + 1, (s1 << 1) | 1, s2 << 1, n);
dfs(col + 1, s1 << 1, (s2 << 1) | 1, n);
dfs(col + 2, (s1 << 2) | 3, (s2 << 2) | 3, n);
絎竴縐嶄笂闈㈡槸1錛岄偅涔堜笅闈竴瀹氭槸0錛岃〃紺烘槸涓涓珫鏀劇殑鏈ㄥ潡銆?br>絎簩縐嶄笂闈㈡槸0錛屽氨鏄榪欎釜浣嶇疆涓瀹氭槸涓涓珫鏀炬湪鍧楃殑涓嬪崐鎴紝閭d箞涓嬩竴琛岃偗瀹氭槸瑕佸彟璧蜂竴琛屼簡錛屾斁涓涓珫鏀炬垨鑰呮í鏀劇殑鏈ㄥ潡閮藉繀欏繪槸1銆?br>絎笁縐嶇浉褰撲簬涓婁笅涓よ鍚勬斁涓涓í鏈ㄥ潡銆?br>瀹炵幇鐨勬椂鍊欐垜鐢ㄤ簡涓涓獀ector璁板綍姣忎釜鐘舵佹墍鏈夊彲琛岀殑杞Щ錛岃繖鏍峰湪dp鐨勬椂鍊欏彲浠ュ姞蹇竴浜涙晥鐜囥?/p>
榪樻湁涓涓棶棰橀渶瑕佽冭檻錛岄偅灝辨槸鍒濆煎拰鏈緇堢殑緇撴灉銆傚鏋滃鎵懼悎娉曠姸鎬侊紝渚濈劧姣旇緝楹葷儲錛屽亣璁懼叡鏈塶琛岋紝鍙互鍒嗗埆鍦ㄨ繖n琛屼笂涓嬫柊鍔犱袱琛屻備笅闈竴琛岄兘鏄?錛岀敱浜庣n琛岃偗瀹氳濉弧錛岃繖鏍鋒柊鍔犵殑鍏?鐨勮灝辯浉褰撲簬欏朵綇浜嗙n琛屼嬌鍏舵病鏈夊嚫鍑猴紙鏈夊嚫鍑洪偅涔堢n+1琛屾湁0錛夛紝鑰岄氳繃絎琻琛屽埌絎琻+1琛岃漿縐諱繚鐣欎簡鎵鏈夊悎娉曠姸鎬侊紱鍚岀悊鏈涓婇潰鍔犵殑閭h淇濊瘉絎竴琛屾病鏈夊嚫鍑恒傛渶鍚庣n+1琛屽搴斿叏1鐨勭姸鎬佸氨鏄渶緇堢殑緇撴灉浜嗐傞氳繃鏂板姞琛屽閥濡欏湴瑙e喅浜嗗垵鍊煎拰緇堝箋?/p>
瀹炵幇鐨勬椂鍊欎篃闇瑕佹敞鎰忎竴涓嬶紝鍦═SP闂涓紝澶栧眰寰幆鏄姸鎬侊紝鍐呭眰鏄偣錛屼箣鎵浠ヨ繖鏍峰啓鍥犱負鍦ㄦ灇涓劇偣鐨勬椂鍊欙紝鍙兘浼氫粠姣斿綋鍓嶇紪鍙峰ぇ鐨勭偣杞Щ錛屼絾鏄敱浜庢棤璁烘庢牱杞Щ榪囨潵鐨勭姸鎬佽偗瀹氭瘮褰撳墠鐘舵佸皬錛堝幓鎺変簡1錛夛紝鎵浠ュ厛浠庡皬鍒板ぇ鏋氫婦鐘舵佸氨淇濊瘉杞Щ榪囨潵鐨勭姸鎬佷竴瀹氭槸綆楄繃鐨勩傝岃繖涓鐩噷闈㈡濂藉弽榪囨潵錛屽洜涓虹姸鎬佸彲鑳戒粠姣斿綋鍓嶇姸鎬佸ぇ鐨勭姸鎬佽漿縐昏繃鏉ワ紝鑰岃鏁拌偗瀹氭槸浠庣紪鍙峰皬鐨勮杞Щ錛屽洜姝ゅ厛鏋氫婦琛屽氨鑳戒繚璇佽漿縐昏繃鏉ョ殑鐘舵佷竴瀹氭槸鏇存柊榪囩殑銆?/p>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 11;
vector<int> g[1<<N];
long long dp[N+2][1<<N];
void dfs(int col, int s1, int s2, int n)
{
if (col >= n)
{
if (s1 < (1 << n) && s2 < (1 << n))
g[s2].push_back(s1);
return;
}
dfs(col + 1, (s1 << 1) | 1, s2 << 1, n);
dfs(col + 1, s1 << 1, (s2 << 1) | 1, n);
dfs(col + 2, (s1 << 2) | 3, (s2 << 2) | 3, n);
}
long long calc(int m, int n)
{
if (m < n) swap(m, n);
dfs(0, 0, 0, n);
int state = 1 << n;
dp[0][0] = 1;
for (int i = 1; i <= m + 1; i++)
for (int s = 0; s < state; s++)
for (int j = 0; j < g[s].size(); j++)
dp[i][s] += dp[i-1][g[s][j]];
return dp[m+1][state-1];
}
int main()
{
int m, n;
while (scanf("%d %d", &m, &n) == 2)
{
if (m == 0 && n == 0)
break;
for (int i = 0; i < (1 << N); i++)
g[i].clear();
memset(dp, 0, sizeof(dp));
printf("%I64d\n", calc(m, n));
}
return 0;
}

]]>