塗抹果醬 狀壓dp

2021-09-29 03:19:20 字數 1983 閱讀 6863

題目描述

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

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

輸入格式

輸入共三行。

第一行:n,m ;

第二行: k;

第三行: m個整數,表示第k 行的方案。

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

輸出格式

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

樣例

樣例輸入

2 2 

1 2 3

樣例輸出

3
資料範圍與提示

對於 30% 的資料,1<=n*m<=20 ;

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

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

這題正解應該是先dfs做出每一行可行解再dp但是也可以在每一行中單獨判斷

直接貼**啦,注釋在裡面

#include#include#include#includeusing namespace std;

const int n=10005;

const int mod=1e6;

int f[n][400];//f[i][j]表示到第i行狀態為j的方案數

int x1[30],x2[30];

int sta[n];//sta[i]記下一行的第i種可行的狀態 ,sta[1]為輸入的第k行狀態

int poww[10];//記錄3^i

bool pd(int x);//判斷單獨一行的狀態x是否合法

bool check(int x,int y); //判斷作為連續上下兩行的x,y狀態是否合法

void init();//預處理出num種每一行可行的方案

inline int read();//快讀

int n,m,k,a[n],num;

int main()

if(!pd(sta[1]))

num=1;

init();

if(k!=2)

else

int numi=0,numj=0,l;

for(i=2;i<=n;i++)

}} if(n==k)numi=1;

else numi=num;

long long ans=0;

for(i=1;i<=numi;i++)

printf("%lld\n",ans);

return 0;

}inline int read()

while(ch>='0'&&ch<='9')

return s*f;

}bool pd(int x)

for(i=1;iif(x1[i]==x1[i+1])

return false;

return true;

}bool check(int x,int y)

while(y!=0)

for(i=1;i<=m;i++)

if(x1[i]==x2[i])

return false;

return true;

}void init()

}

塗抹果醬(狀壓dp)

塗抹果醬 tyvj兩周年慶典要到了,sam想為tyvj做乙個大蛋糕。蛋糕俯檢視是乙個n m的矩形,它被劃分成n m個邊長為1 1的小正方形區域 可以把蛋糕當成n行m列的矩陣 蛋糕很快做好了,但光禿禿的蛋糕肯定不好看!所以,sam要在蛋糕的上表面塗抹果醬。果醬有三種,分別是紅果醬 綠果醬 藍果醬,三種...

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...