标签:代码 namespace ret 搜索 表示 mes style c++ 记忆化
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=1079
[算法]
f[c1][c2][c3][c4][c5][pre]表示有c1种颜色可以涂1个木块,c2中颜色可以涂2个木块,.....,上一次的颜色可以涂pre个木块
记忆化搜索即可
[代码]
#include<bits/stdc++.h> using namespace std; const int P = 1e9 + 7; int i,k,x; int cnt[10]; int f[16][16][16][16][16][6]; inline int dp(int c1,int c2,int c3,int c4,int c5,int pre) { if (c1 < 0 || c2 < 0 || c3 < 0 || c4 < 0 || c5 < 0) return 0; if (!c1 && !c2 && !c3 && !c4 && !c5) return f[c1][c2][c3][c4][c5][pre] = 1; if (f[c1][c2][c3][c4][c5][pre] != -1) return f[c1][c2][c3][c4][c5][pre]; f[c1][c2][c3][c4][c5][pre] = 0; if (pre == 2) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c1 - 1) * dp(c1 - 1,c2,c3,c4,c5,1)) % P; else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c1 * dp(c1 - 1,c2,c3,c4,c5,1)) % P; if (pre == 3) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c2 - 1) * dp(c1 + 1,c2 - 1,c3,c4,c5,2)) % P; else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c2 * dp(c1 + 1,c2 - 1,c3,c4,c5,2)) % P; if (pre == 4) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c3 - 1) * dp(c1,c2 + 1,c3 - 1,c4,c5,3)) % P; else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c3 * dp(c1,c2 + 1,c3 - 1,c4,c5,3)) % P; if (pre == 5) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c4 - 1) * dp(c1,c2,c3 + 1,c4 - 1,c5,4)) % P; else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c4 * dp(c1,c2,c3 + 1,c4 - 1,c5,4)) % P; f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c5 * dp(c1,c2,c3,c4 + 1,c5 - 1,5)) % P; return f[c1][c2][c3][c4][c5][pre]; } int main() { scanf("%d",&k); for (i = 1; i <= k; i++) { scanf("%d",&x); cnt[x]++; } memset(f,255,sizeof(f)); printf("%d\n",dp(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],0)); return 0; }
标签:代码 namespace ret 搜索 表示 mes style c++ 记忆化
原文地址:https://www.cnblogs.com/evenbao/p/9340865.html