click here~~
題意:給出 n 個區間 [a,b],每個區間有個權值 wi,如何取不相交的區間,使權值最大。
解題思路:
估計是一道很經典的題目,目前學習了三種解法。
1、如果區間範圍比較小,例如 zoj 3637。則可以用 dp[i] 表示考慮到數軸中 i 點時的最大值。
存區間的時候,不再存入結構體,而是存入乙個下標為起始點值的vector。當考慮到 i 點時,dp[i] 一定是最大值,然後用 dp[i] 去向後更新 dp[j]。
複雜度o(m+n)。(m 是區間總範圍)
#include #include #include #include #include using namespace std;
const int n = 24*60*370 + 10;
int get_month(string s)
int day = ;
int read()
vector< pair> events[n];
double dp[n];
int main()
(j < i && i,j 不相交)。其實是這樣。這是上次網路賽自己想的。複雜度o(n*n)。
2> dp[i] 記錄考慮前 i 個區間的最大值,然後 dp[i] = max(dp[i-1] , dp[j] + w)(j < i && i,j 不相交)。也就是這題的做法了。
其實 2> 應該叫做 1> 的公升級版。因為轉移的時候,第乙個是乙個集合,而第二個是乙個值(只要找到最大的這樣的 j 就行了,因為 dp[i] >= dp[i-1])。
而這個特性,還可以通過二分,使轉移的複雜度下降到o(log n),從而總複雜度 o(n*log n)。
#include #include using namespace std;
const int n = 5e3 + 5;
struct int
}a[n];
int find(int j)
return r - 1;
}int dp[n];
int main()
printf("%d\n",dp[n]);
}return 0;
}
NYOJ 720 專案安排
題目資訊 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 小明每天都在開源社群上做專案,假設每天他都有很多專案可以選,其中每個專案都有乙個開始時間和截止時間,假設做完每個專案後,拿到報酬都是不同的。由於小明馬上就要碩士畢業了,面臨著買房 買車 給女友買各種包包的鴨梨,但是他的...
nyoj720 專案安排 二分 dp
思路 dp i 表示前i個專案的最大收益,轉移方程很好寫dp i max,val i 表示第i個專案的價值,dp k 表示前k個的最佳收益,k滿足ed k st i 並且是最接近st i 的那個專案,即i需要找到乙個可以相容的專案,因此需要對所有專案按照結束時間公升序排序。但是不容忽略的是當結束時間...
九度 1499 專案安排 一維DP
題目描述 總結 1.和 leetcode palindrome cut 的設定方法類似 2.時間複雜度為 o n 2 n 為任務個數 3.為了優化空間複雜度 同時也優化時間複雜度 dp i 表示第 i 個任務的開始時間到 endtime 之間能夠獲得的最大收益 source.cpp created ...