線性dp 膜拜(洛谷 P1564)

2021-10-04 19:07:42 字數 1044 閱讀 8999

題目描述

神牛有很多…當然…每個同學都有自己衷心膜拜的神牛.

某學校有兩位神牛,神牛甲和神牛乙。新入學的 n 位同學們早已耳聞他們的神話。

所以,已經衷心地膜拜其中一位了。現在,老師要給他們分機房。但是,要麼保證整個機房都是同一位神牛的膜拜者,或者兩個神牛的膜拜者人數差不超過 m。另外,現在 n 位同學排成一排,老師只會把連續一段的同學分進乙個機房。老師想知道,至少需要多少個機房。

輸入格式

輸入檔案第一行包含兩個整數 n 和 m。

第 2 到第 (n+1) 行,每行乙個非 1 即 2 的整數,第 (i+1) 行的整數表示第 i 個同學崇拜的物件,1 表示甲,2 表示乙。

輸出格式

輸出乙個整數,表示最小需要機房的數量。

把2變為-1,則題目可以轉化為:把長為n的串分為連續的幾段,每段的和絕對值<=m,求最小段數;

狀態轉移方程為:dp[i]=min(dp[j]+1,dp[i]),j 為 i 的前面位置,保證 j 到 i 的這部分和絕對值<=m,複雜度為n^2;

**:

#include

#define ll long long

#define pa pair

#define ls k<<1

#define rs k<<1|1

#define inf 0x3f3f3f3f

using

namespace std;

const

int n=

3000

;const

int m=

2000100

;const

int mod=

1e9;

int sum[n]

,a[n]

,dp[n]

;int

main()

for(

int i=

1;i<=n;i++)}

cout<

}

洛谷 題解 P1564 膜拜

先分析題目,是個很明顯的dp問題。很容易我們就可以想到dp i 表示對於前i個人的最少分配的機房數。下面我們開始找動態轉移方程。再仔細讀一遍題,老師只會把連續一段的同學分進乙個機房。這樣就簡單了。因為老師只會把連續一段的同學分進乙個機房,那麼對於第i位同學,我們就可以查驗第j位同學,是否能夠使得j ...

P1564 膜拜(洛谷) 動態規劃

p1564 膜拜 這一題使用遞迴求解,考慮乙個區間 i,j 若從i到j可分在乙個機房,則直接返回,否則,遍歷每乙個點k,若 i,k 可分在乙個機房,則求 k 1,j 分組的數目最小值。求解過程中,已求的區間會被儲存起來。這裡固定n include include include define siz...

洛谷 P1970 花匠 線性dp

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h nh1 h2 hn 設當一部分花被移走後,剩下的花的高度依...