日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【每日一题】7月20日题目精讲—着色方案

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【每日一题】7月20日题目精讲—着色方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:牛客網:

文章目錄

    • 題目描述
    • 題解:
    • 代碼:

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld

題目描述

有n個木塊排成一行,從左到右依次編號為1~n。 你有k種顏色的油漆,其中第i種顏色的油漆足夠涂ci個木塊。
所有油漆剛好足夠涂滿所有木塊,即c1+c2+…+ck=n。
相鄰兩個木塊涂相同色顯得很難看,所以你希望統計任意兩個相鄰木塊顏色不同的著色方案。

輸入描述:

第一行為一個正整數k,第二行包含k個整數c1, c2, … , ck。

輸出描述:

輸出一個整數,即方案總數模1,000,000,007的結果。

示例1
輸入
復制

3 1 2 3

輸出
復制

10

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,一次類推都是這樣
然后考慮轉移方程:

dp[a][b][c][d][e][1]=dp[a-1][b][c][d][e][1]*a+dp[a+1][b-1][c][d][e][2]*b+dp[a][b+1][c-1][d][e][3]*c+dp[a][b][c+1][d-1][e][4]*d+dp[a][b][c][d+1][e-1][5]*e

我們在遞推中可以寫成這種形式

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日题目精讲—着色方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。