自從現在我一直在試圖解決這個TopCoder問題,並且我無法想出針對此問題的基於DP的解決方案(如下所示)。我還找到了別人解決問題的一個解決方案(同樣在下面給出),但我甚至無法理解它。這個DP解決方案如何接近?
任何人都可以幫我解決這個問題嗎?我不明白哪種思路會導致這種解決方案?我如何着手在我的腦海中建立復發關係?我完全不知道如何解決這個問題,或者寫這個解決方案的人是如何寫這個問題的。 PS:我知道TopCoder有問題的社論,但是這個還沒有發佈。我不知道爲什麼。
這裏的problem
福克斯彩虹有很多功課要做。作業由一些相互獨立的任務組成。不同的任務可能需要不同的時間完成。你得到一個int [] workCost。對於每個我, 第i個任務需要workCost [i]秒才能完成。她想 參加派對並結識她的朋友,因此她想盡快完成所有 任務。
主要問題是,包括Ciel在內的所有狐狸真的很討厭做功課 。每隻狐狸只願意完成其中一項任務。幸運的是, 哆啦A夢是一隻來自22世紀的機器人貓,它爲Fox Ciel提供了一個分體式的錘子:一種可以將任何狐狸分成兩隻狐狸的魔法小工具。
給你一個int splitCost。在狐狸身上使用分割錘是瞬時的 。一旦狐狸使用錘子,狐狸就開始分裂。在splitCost秒後,她將變成兩隻狐狸 - 原始狐狸 和另一隻全新的狐狸。當狐狸在分裂時,不允許再次使用錘子。
任務的工作不能被中斷:一旦狐狸開始工作 一項任務,她必須完成它。這是不允許多個狐狸 合作在同一個任務。一隻狐狸在使用錘子分割 時無法完成任務。有可能多次分裂相同的狐狸 。她可以在 之前和之後分裂一隻狐狸,她解決了其中一項任務。
計算並返回狐狸能夠解決所有任務的最少時間。
這裏的solution:通常
1:
2: const int maxN = 55;
3: int dp[maxN][maxN*2];
4: int N;
5: int splitC;
6: vector<int> workC;
7:
8: int rec(int,int);
9: int FoxAndDoraemon::minTime(vector <int> workCost, int splitCost) {
10:
11: sort(workCost.begin(), workCost.end());
12: N = workCost.size();
13: splitC = splitCost;
14: workC = workCost;
15: memset(dp, -1, sizeof(dp));
16:
17: return rec(N-1, 1);
18: }
19:
20: int rec(int jobs, int fox)
21: {
22: if(jobs == -1) return 0;
23:
24: int& val = dp[jobs][fox];
25: if(val != -1) return val;
26: val = 0;
27:
28: if((jobs+1) <= fox) val = max(workC[jobs] , rec(jobs-1, fox-1));
29: else
30: {
31: //split fox
32: val = splitC + rec(jobs, fox + 1);
33:
34: if(!(fox == 1 && jobs > 0))
35: val = min(val, max(workC[jobs], rec(jobs-1, fox-1)));
36: }
37: return val;
38: }
39:
「如果你有超過1個任務,你必須拆分第一隻狐狸。」不對。你可以讓單個狐狸依次完成它們。但是,這可能不是最理想的。 – 2015-01-05 01:28:22