514 柵欄染色

2021-08-31 21:30:27 字數 916 閱讀 5952

從物理學到計算機,再到硬體,再到人工智慧!

藍橋杯備賽 (lintcode上刷的第三題)

我們有乙個柵欄,它有n個柱子,現在要給柱子染色,有k種顏色可以染。

必須保證不存在超過2個相鄰的柱子顏色相同,求有多少種染色方案。

最開始,我想用動態陣列儲存每一種方案的第i根柱子的顏色。後來發現這樣資料量太大,而且記錄也很困難。最後轉換思路,用dp[i]表示到第i根柱子時有多少種塗色方案。這樣就很容易就實現了。

dp[i]和dp[i + 1]表示分別到前面兩根柱子時的塗色方案。

首先賦初值:dp[0] = k;dp[1] = k * k;

如果dp[i] == dp[i + 1],說明前面兩根柱子顏色相同,則dp[i + 3] = (k - 1) * dp[i + 2];如果dp[i] != dp[i + 1],說明前面兩根柱子顏色不相同,則dp[i + 3] = (k - 1) * dp[i + 1]。

因為此段時間一直在刷動態規劃的題,所以一般都採用動態規劃來求解!

package dp;

public class postcolored514_1111

// 當只有一根柱子時,有多少種顏色就有多少種方案

if (n == 1)

// 建立乙個陣列dp,dp[i]表示前i根柱子有多少種塗色方案

int dp = new int[n];

if (n == 2) else

} return dp[n - 1];

} public static void main(string args)

}

514 柵欄染色

3.28 這個題自己的錯誤,廢了很多時間。如果是單純地相鄰不許同色的話,應該就是這樣的 public static int numways1 int n,int k if k 1 n 2 int x int math.pow k 1,n 1 return x k 2 n 1 如果是不允許三根柱子相鄰...

LintCode 柵欄染色

lintcode 柵欄染色 lintcode表述有問題,原文是 必須保證任意兩個相鄰的柱子顏色不同 應該表述為 至多有兩根相鄰的柱子具有相同的顏色 此題使用動態規劃,狀態轉移方程為f i f i 1 k 1 f i 2 k 1 顯然f 0 k,f 1 k k 方法一 class solution p...

LintCode 柵欄染色

題目描述 我們有乙個柵欄,它有n個柱子,現在要給柱子染色,有k種顏色可以染。必須保證最多只有兩個相鄰的柱子顏色相同,求有多少種染色方案。樣例 n 3,k 2,return 6 post 1,post 2,post 3 way1 0 0 1 way2 0 1 0 way3 0 1 1 way4 1 0...