動態規劃起步(狀態壓縮) hihoCoder

2022-03-06 18:12:48 字數 2169 閱讀 1096

題目解釋的很清楚了,不多說

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

描述小hi和小ho在兌換到了喜歡的獎品之後,便繼續起了他們的美國之行,思來想去,他們決定乘坐火車前往下一座城市——那座城市即將舉行美食節!

但是不幸的是,小hi和小ho並沒有能夠買到很好的火車票——他們只能夠乘坐最為破舊的火車進行他們的旅程。

不僅如此,因為美食節的吸引,許多人紛紛踏上了和小hi小ho一樣的旅程,於是有相當多的人遭遇到了和小hi小ho一樣的情況——這導致這輛車上的人非常非常的多,以至於都沒有足夠的位置能讓每乙個人都有地方坐下來。

小hi和小ho本著禮讓他們的心情——當然還因為本來他們買的就是站票,老老實實的呆在兩節車廂的結合處。他們本以為就能夠這樣安穩抵達目的地,但事與願違,他們這節車廂的乘務員是乙個強迫症,每隔一小會總是要清掃一次衛生,而時值深夜,大家都早已入睡,這種行為總是會驚醒一些人。而一旦相鄰的一些乘客被驚醒了大多數的話,就會同乘務員吵起來,弄得大家都睡不好。

將這一切看在眼裡的小hi與小ho決定利用他們的演算法知識,來幫助這個有著強迫症的乘務員——在不與乘客吵起來的前提下盡可能多的清掃垃圾。

小hi和小ho所處的車廂可以被抽象成連成一列的n個位置,按順序分別編號為1..n,每個位置上都有且僅有一名乘客在休息。同時每個位置上都有一些垃圾需要被清理,其中第i個位置的垃圾數量為wi。乘務員可以選擇其中一些位置進行清理,但是值得注意的是,一旦有編號連續的m個位置中有超過q個的位置都在這一次清理中被選中的話(即這m個位置上的乘客有至少q+1個被驚醒了),就會發生令人不愉快的口角。而小hi和小ho的任務是,計算選擇哪些位置進行清理,在不發生口角的情況下,清掃盡可能多的垃圾。

提示一:無論是什麼動態規劃,都需要乙個狀態轉移方程!

提示二:好像什麼不對勁?狀態壓縮**去了?

輸入每個測試點(輸入檔案)有且僅有一組測試資料。

每組測試資料的第一行為三個正整數n、m和q,意義如前文所述。

每組測試資料的第二行為n個整數,分別為w1到wn,代表每乙個位置上的垃圾數目。

對於100%的資料,滿足n<=1000, 2<=m<=10,1<=q<=m, wi<=100

輸出對於每組測試資料,輸出乙個整數ans,表示在不發生口角的情況下,乘務員最多可以清掃的垃圾數目。

樣例輸入

5 2 1

36 9 80 69 85

樣例輸出

201

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for (int i = 0;i < (n);i++)

#define rep_1(i,n) for (int i = 1;i < (n);i++)

#define rep_2(i,be,en) for (int i = (be);i < (en);i++)

#define dwn(i,n) for (int i = (n);i >= 0;i--)

#define dwn_1(i,n) for (int i = (n);i >= 1;i--)

#define dwn_2(i,en,be) for (int i = (en);i >= (be);i--)

#define fr(n) freopen((n),"r",stdin)

#define fw(n) freopen((n),"w",stdout)

#define gets(ch) fgets((ch),maxn,stdin);

#define inf 0x3f3f3f3f

#define maxn 100010

using namespace std;

typedef long long ll;

typedef mapmint;

typedef vectorvint;

typedef setsint;

int get_bit_sum(int s)

return ans;

}int best[2][1030];

int main ()

}rep(i,(1 << m))

cout << ans << endl;

}}

狀態壓縮動態規劃

動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...

動態規劃 狀態壓縮

這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...

狀態壓縮動態規劃

我們可以使用乙個01串a來表示乙個集合。對於數x x 0 用ax 0表示它不在該集合中,用ax 1表示它在該集合中。將01串a看作是乙個二進位制數,我們把它轉換為十進位制,就可以使用乙個十進位制整數來表示乙個實際使用二進位制方式表示的集合。這樣,我們可以使用位運算方便地處理集合的操作。交集兩個集合a...