題目描述
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...