SPOJ RENT 01揹包的活用 二分

2022-05-22 14:57:11 字數 676 閱讀 6754

這個題目給定n航班的發出時間和結束時間以及價值,要求不衝突時間的最大價值

第一時間想到經典的n方dp,即對航班按發出時間排一下序之後每個i對前面的都掃一遍

時間過不了n有10萬,只能想優化了,一開始想了個用樹狀陣列記錄每次加入某個航班之後 後面的所有在結束時間後的區間全部可以加乙個最大值,但是首先時間區間的量更大,而且樹狀陣列不好這麼操作

後來實在沒見過這種dp,還是看的別人的演算法,還是挺叼的,不過其實還是沿用的揹包思想

對於每個航班區間,我只需要考慮取或者不取,這樣的話,對航班按出發時間s排序,從後往前,對該航班結束時間t找到 i+1到n中滿足出發時間ti<=sk(i當然,為什麼要從後往前掃值得深思,首先這樣掃過來肯定是對的,因為他的子結構只會在他後面(即滿足結束時間《=發出時間的),而且他們已經是最優了。反過來如果從前面開始掃,那他們的子結構還是在後面,但後面的還沒訪問過,不是最優值,所以無法轉移。因此這就是為什麼轉移是這樣的

這個題目真的不錯,dp模型很經典,但是狀態轉移很新穎

#include #include #include #include using namespace std;

struct node

return l;

}int main()

printf("%d\n",dp[0]);

}return 0;

}

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...

揹包專題 01揹包

暑假集訓開始了,按照隊裡的分配,我是弄dp的,嘛,於是我又一次的開始了從01揹包開始學習,昨天將杭電的幾道01揹包重新做了一遍,下面講講我自己對於01揹包的理解。首先01揹包題目的雛形是 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...