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,則前一步只...