原创 ZOJ 3494 BCD Code 數位DP+AC自動機

其實還是比較裸的數位DP,只不過需要用AC自動機來預先處理一下,寫了3個小時,各種調試,蛋碎了一地啊。不過幸好最後還是做出來了。 思路:先用AC自動機預處理字符串,數位DP時以dp[index][pos][fg]來表示狀態,分別爲層數,判

原创 FZU 1894 志願者選拔

是個簡單的單調隊列,不多說了。 #include <cstdio> #include <cstring> #include <string> #include <iostream> #include <map> #include <vec

原创 HDU 3474 Necklace 單調隊列

題意:給你一串項鍊,上面串聯着C寶石和J寶石,在項鍊任意一點斷開,從左到右或者從右到左收集寶石,且保證任意時刻C寶石的數量要大於B寶石,求滿足條件的點的個數。 思路:將寶石C看做1,寶石J看做-1,若從第 i 點斷開開始收集,要保證sum

原创 HDU 4614 Vases and Flowers 線段樹區間更新

題意:給你n個花瓶,m次操作,若k==1,則從第A個開始插入花,直到插入了F朵花或者沒有空花瓶了,若k==2,則將花瓶a~b清空。 思路:比較裸的線段樹,對於第一種操作,若能插花則先求出插花的左右邊界,然後將這個區間空位更新爲0,第二種操

原创 HDU 3415 Max Sum of Max-K-sub-sequence

我用單調隊列做的,隊列內按區間和從大到小排列,則隊列頭到當前點的區間和最大,需要注意的是數組要開大一點不然wrong到哭啊。 #include <cstdio> #include <cstring> #include <string> #

原创 POJ 2082 Terrible Sets

題意:給你連續n個矩陣的長和寬,求出最大連續矩陣的面積。 單調棧。也可用DP寫,具體和HDU1505類似。這裏就寫單調隊列了。 #include <cstdio> #include <cstring> #include <string>

原创 HDU 4628 Pieces

狀態DP,以dp[i]表示刪減爲狀態i時所需要的最小次數,dp[i] = min(dp[i],dp[j]+1);其中保證j-i是迴文,因爲要保證j狀態包含i狀態,所以第二重循環式j = (j+1)|i。 #include <cstdio>

原创 POJ 3017 Cut the Sequence 單調隊列+平衡樹

題意:給出一個序列,求將序列劃分成若干段,且每段和不超過m的情況下,每段的最大值的和最小爲多少。 思路:比較樸素的想法還是比較好想的,即:dp[i] = min{ dp[j]+max{ num[k] } };其中lef[i] <= j <

原创 HDU 1668 POJ 2288 Islands and Bridges

以下解題思路摘自:http://www.cnblogs.com/jackge/archive/2013/05/24/3096162.html 取dp[state][i][j]表示state狀態下倒數第二個島爲i,最後一個島爲j時的最優解,

原创 HDU 3401 Trade

題意:給出t天內每天股票的買入價格,賣出價格,最多購買數和最多賣出數,求t天后最多能賺多少、 思路:用dp[i][j]表示第i天時手裏還剩j支股票的最大獲利。 第i天買入時:dp[i][j] = max{dpi-1][k]-(j-k)*a

原创 UVA 11008 Antimatter Ray Clearcutting

狀態DP,以dp[i]記錄砍掉的樹的狀態爲 i 時的最少發射激光數,對於每個狀態考慮將當前狀態下未被砍的樹中選一顆來砍,則考慮兩種情況,一個是這顆樹需要單獨一束激光來砍,另一個就是這棵樹和其他已經被砍的某一顆樹形成一條線,而在這條線上的點

原创 POJ 2441 Arrange the Bulls

題意:給你n頭牛以及m個房間,每頭牛隻可放在一些固定的房間,求每頭牛都放置到房間中的方案數。 思路:用dp[i][j]表示第i頭牛在狀態j時的方案數,則,dp[i][j] += dp[i-1][k];其中k爲前i-1頭牛放置成狀態k的方案

原创 POJ 2823 Sliding Window

簡單單調隊列,其實這題也可以用線段樹或者RMQ來做,在這裏我就只寫了單調隊列的了。 還有就是提交時用C++,用G++超時了。 #include <cstdio> #include <cstring> #include <string> #

原创 HDU 1506 Largest Rectangle in a Histogram

思路: 對於每一塊木板,Area=height[i]*(j-k+1)  其中,j<=x<=k,height[x]>=height[i];找j,k成爲關鍵,一般方法肯定超時, 利用動態規劃,如果它左邊高度大於等於它本身,那麼它左邊的左邊界一

原创 HDU 2993 MAX Average Problem

斜率優化DP。 這題是論文《淺談數形結合思想在信息學競賽中的應用》http://wenku.baidu.com/view/b97cd22d0066f5335a8121a3.html中的例二,具體解題思路可以去論文中看看, 說說這題坑的地方