Loj10172 塗抹果醬

2021-09-30 16:32:11 字數 2086 閱讀 7204

題目描述

tyvj 兩周年慶典要到了,sam 想為 tyvj 做乙個大蛋糕。蛋糕俯檢視是乙個 n×m 的矩形,它被劃分成 n×m 個邊長為 1×1 的小正方形區域(可以把蛋糕當成 nnn 行 mmm列的矩陣)。蛋糕很快做好了,但光禿禿的蛋糕肯定不好看!所以,sam 要在蛋糕的上表面塗抹果醬。果醬有三種,分別是紅果醬、綠果醬、藍果醬,三種果醬的編號分別為 1,2,31,2,31,2,3。為了保證蛋糕的視覺效果,admin 下達了死命令:相鄰的區域嚴禁使用同種果醬。但 sam 在接到這條命令之前,已經塗好了蛋糕第 kkk 行的果醬,且無法修改。

現在 sam 想知道:能令 admin 滿意的塗果醬方案有多少種。請輸出方案數 mod106。若不存在滿足條件的方案,請輸出 000。

輸入格式

輸入共三行。

第一行:n,mn, mn,m;

第二行:kkk;

第三行:mmm 個整數,表示第 kkk 行的方案。

字母的詳細含義見題目描述,其他參見樣例。

輸出格式

輸出僅一行,為可行的方案總數。

樣例樣例輸入

2 2 

1 2 3

樣例輸出

3

樣例說明

方案一方案二

方案三2 3 

1 22 3 

3 12 3 

3 2

資料範圍與提示

對於 30% 的資料,1≤n×m≤20;

對於 60% 的資料,1≤n≤1000,1≤m≤3;

對於 100% 的資料,1≤n≤10000,1≤m≤5。

這道題用狀壓dp,是三維的,有很多細節要注意處理。

其中我用了比較笨的儲存方法,但是能有效地忽略掉特殊行。

#include #include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 100010

#define inf 10000009

#define mod 1000000

#define ll long long

#define in(a) a=read()

#define rep(i,k,n) for(int i=k;i<=n;i++)

#define drep(i,k,n) for(int i=k;i>=n;i--)

#define cl(a) memset(a,0,sizeof(a))inline

intread()

inline

void

out(int

x)int

n,m,k;

int pow[110

]; ll f[

10010][250

];struct

nodetree[

10010

];bool check1(int a,int

b)

while

(b) rep(i,

1,m)

return

true;}

bool check2(int

a) rep(i,

2,m)

if(sa[i]==sa[i-1

])

return

false

;

return

true;}

void

init()

}return;}

intdp()

rep(i,

1,tree[n].num) ans=(ans+f[n][i])%mod;

return

ans;

}int

main()

if(!check2(tree[k].a[1

])) init();

/*rep(i,1,n)

LOJ 10172 塗抹果醬

思路 看到資料範圍,考慮狀壓 dp 發現每一格有 3 種情況,考慮用三進製來表示。列舉所有情況,將可行解與其三進製建立對映關係。由於第 k 行上下互不影響,我們可以分別進行 dp 根據乘法原理相乘即可得到答案。為了優化時間,我們可以先將可互相轉移的狀態記錄下來,dp 時直接查詢即可。include ...

LOJ 10172 塗抹果醬 狀壓DP

題目描述 看完題目,很清楚的想到這道題用狀壓dp來做,只不過這道題是個三進製的,做題過程中須注意轉換。下面簡單說一下演算法 1.用0 1 2 來代替題目中的1 2 3這樣比較方便,將第k行以三進製數存入。先用乙個陣列存所以可行的狀態,若第k行的狀態不在陣列裡,直接輸出0.2.這道題中已經給出了一行的...

DP 塗抹果醬

紀念第乙個純自己寫的狀壓dp 感謝我的好友吳穎涵幫助除錯 流下了沒有技術的淚水 卡點 1.函式see1 see2中的for不能用while 關於0的處理 2.統計答案的迴圈意義review 3.萬年不變陣列範圍 首先陣列意義開範圍 include include include include in...