【每日一题】7月20日题目精讲—着色方案
生活随笔
收集整理的這篇文章主要介紹了
【每日一题】7月20日题目精讲—着色方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
來源:??途W:
文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
有n個木塊排成一行,從左到右依次編號為1~n。 你有k種顏色的油漆,其中第i種顏色的油漆足夠涂ci個木塊。
所有油漆剛好足夠涂滿所有木塊,即c1+c2+…+ck=n。
相鄰兩個木塊涂相同色顯得很難看,所以你希望統計任意兩個相鄰木塊顏色不同的著色方案。
輸入描述:
第一行為一個正整數k,第二行包含k個整數c1, c2, … , ck。
輸出描述:
輸出一個整數,即方案總數模1,000,000,007的結果。
示例1
輸入
復制
輸出
復制
1<=k<=15 ,1<= ci <=5
題解:
記憶化搜索
dp[a][b][c][d][e][last]
表示每一種顏色分別剩下啊a,b,c,d,e個方案數,有a種一個(可以涂1塊木塊的有多少種顏色),b種兩個,c種三個…e種五個,last表示上一次用的是可以涂last個木塊的油漆
因為我們不能連續涂兩塊相同的顏色,如果上一次用的還能涂i次的油漆,那么當前就多一種還能涂i-1次的油漆未使用
所以如果b-1的話,a要+1,一次類推都是這樣
然后考慮轉移方程:
我們在遞推中可以寫成這種形式
if(a1) ans = (ans + 1ll * (a1 - (last == 2)) * dfs(a1 - 1, a2, a3, a4, a5, 1)) % mod;(last==2)則是特判上一種顏色的種類,否則會造成重復
代碼:
#include <bits/stdc++.h>const int mod = 1e9 + 7; using namespace std;typedef long long ll;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x; }void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48); }ll dp[20][20][20][20][20][10]; int n, a[10];ll dfs(int a1, int a2, int a3, int a4, int a5, int last) {if(dp[a1][a2][a3][a4][a5][last]) return dp[a1][a2][a3][a4][a5][last];ll ans = 0;if(a1) ans = (ans + 1ll * (a1 - (last == 2)) * dfs(a1 - 1, a2, a3, a4, a5, 1)) % mod;if(a2) ans = (ans + 1ll * (a2 - (last == 3)) * dfs(a1 + 1, a2 - 1, a3, a4, a5, 2)) % mod;if(a3) ans = (ans + 1ll * (a3 - (last == 4)) * dfs(a1, a2 + 1, a3 - 1, a4, a5, 3)) % mod;if(a4) ans = (ans + 1ll * (a4 - (last == 5)) * dfs(a1, a2, a3 + 1, a4 - 1, a5, 4)) % mod;if(a5) ans = (ans + 1ll * a5 * dfs(a1, a2, a3, a4 + 1, a5 - 1, 5)) % mod;return dp[a1][a2][a3][a4][a5][last] = ans; }int main() {n = read();for(int i = 1; i <= n; i++) {int x = read();a[x]++;}for(int i = 1; i <= 5; i++) dp[0][0][0][0][0][i] = 1;print(dfs(a[1], a[2], a[3], a[4], a[5], 0));return 0; }總結
以上是生活随笔為你收集整理的【每日一题】7月20日题目精讲—着色方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的ll命令详解(linux的l
- 下一篇: 温州旅游景点介绍 去温州旅游可以去哪里玩