序列型動規

2021-10-02 09:18:56 字數 1153 閱讀 6761

d[i]中的i表示前i的元素的某種性質。

有一排n棟房子,每棟房子要漆成k種顏色中的一種

任何兩棟相鄰的房子不能漆成同樣的顏色

房子i染成第j種顏色的花費是cost[i][j]

問最少需要花多少錢油漆這些房子

輸入;n = 3, k = 3

cost = [[14,2,11],[11,14,5],[14,3,10]]

輸出:10(房子0藍色,房子1綠色,房子2藍色, 2+5+3=10)

需要記錄油漆前i棟房子並且房子i-1是顏色1, 顏色2,…,顏色k的最小花費·:d[i][1], d[i][2], …,d[i][k]

轉移方程:

d[i][j] = min(k不等於j)+cost[i-1][j];

時間複雜度o(nk^2)

每次需要求d[i-1][1],…,d[i-1][k]中除了乙個元素之外其他元素的最小值

優化

如果最小值是第i個元素,次小值是第j個元素

1.只要除掉的元素不是第i個,剩下的最小值就是第i個元素

2.如果除掉的元素是第i個,剩下的最小值就是第j個元素

記錄下最小值和次小值

複雜度降為o(nk)

#include

#include

using

namespace std;

int d[

10000][

10000

], cost[

10000][

10000

], n, k;

intmain()

}for

(int i =

0; i < k; i++

)for

(int i =

1; i <= n; i++

)else}}

for(

int j =

0; j < k; j++

)else}}

int res =

0x3f3f3f3f

;for

(int i =

0; i < k; i++

)printf

("%d"

, res)

;return0;

}

石子合併(區間型動規)

在乙個圓形操場的四周擺放n堆石子 n 500 現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數n及每堆的石子數 選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小 選擇一種合併石子的方案,使得做n 1次合...

尼克的任務(座標型動規)

description 尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為 n 分鐘,從第一分鐘開始到第 n 分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完戍,...

DP 2 計數型動規

給定m行n列的網格,有乙個機械人從左上角 0,0 出發,每一步可以向下或者向右走一步,問有多少種不同的方式走到右下角.最後一步 子問題 對於任意乙個格仔 i,j f i j f i 1 j f i j 1 初始條件 f 0 0 1 機械人只有一種方式到達左上角 邊界情況 i 0或者j 0,則前一步只...