動態規劃 顏料塗牆問題

2021-07-22 01:46:31 字數 2135 閱讀 6901

有一面長度為n(n<=10000)的牆,如果要將每單位長度的牆塗上紅、綠、籃其中的一種顏色,而且紅色牆右邊不能緊鄰綠色的牆,綠色的牆右邊不能緊鄰藍色的牆,請問有幾種塗色的方法?

0代表紅色,1代表綠色,2代表藍色

初始值f(1, 0) = f(1, 1) = f(1, 2) = 1;

狀態轉移方程:

for(n>1)

f(n, 0) = f(n-1, 0)+f(n-1, 1)+f(n-1, 2)

f(n, 1) = f(n-1, 1)+f(n-1, 2)

f(n, 0) = f(n-1, 0)+f(n-1, 2)

下邊兩種代發原理是相同的,一種採用無記錄的方式,另外採用一種有記錄的方式:

#include#include#includeusing namespace std;

long long f(int n, int c, long long *p)

int main()

; while (cin >> n)

printf("%s %s\n", __date__, __time__);

system("pause");

return 0;

}

執行結果:

10

5842 耗時:0

15396655 耗時:0.047

184983377 耗時:0.218

1911584946 耗時:0.626

2026931732 耗時:1.076

2162608681 耗時:2.575

22145547525 耗時:5.711

23338356945 耗時:13.288

^zaug 25 2016 10:36:34

請按任意鍵繼續. . .

從運算結果我們可以看到,這種無記錄的計算方式是非常耗時的!!

#include#include#includeusing namespace std;

long long f(int n, int c, long long **p)

return m;

}int main()

; while (cin >> n)

p[1][0] = 1;

p[1][1] = 1;

p[1][2] = 1;

time_t t1, t2;

t1 = clock();

long long f1 = f(n, 0, p);

long long f2 = f(n, 1, p);

long long f3 = f(n, 2, p);

t2 = clock();

cout << f1 + f2 + f3 << "\t共耗時:" << (double)(t2 - t1) / (clocks_per_sec) << endl;

for (int i = 0; i < n + 1; ++i)

free(p[i]);

free(p);

} cout << __date__ << " " << __time__ << endl;

system("pause");

return 0;

}

執行結果:

10

5842 共耗時:0

15396655 共耗時:0

2026931732 共耗時:0

2162608681 共耗時:0

22145547525 共耗時:0

23338356945 共耗時:0

251828587033 共耗時:0

30124155792775 共耗時:0

358429820731201 共耗時:0

^zaug 25 2016 10:40:00

請按任意鍵繼續. . .

從結果中我們可以看到,這種方法的執行時間非常快!!!

動態規劃問題

思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...

動態規劃問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...

動態規劃問題

以下內容基於個人理解。一 什麼是動態規劃 動態規劃 dp 演算法,指的是 乙個問題的解決是依賴於若干個和該問題相似,但比該問題的問題規模更小的問題時,所採用的一種演算法。動態規劃是自底向上的思考問題的方法,通常要從最底層的問題開始考慮。而這類問題的特點是 解決所有本層次問題後,就可以解決上一層的問題...