描述
小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<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
#include<bitset>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define bug(msg) cout << msg << endl;
using namespace std;
#define eps 1e-8
#define N 1005
#define M 11
int n,m,q;
int value[N];
int dp[N][1<<M];
inline int countBit(int v)
{
int nResult = 0;
while (v)
{
nResult++;
v &= (v-1);
}
return nResult;
}
int solve()
{
const int nMax = 1 << m;
memset(dp, 0, sizeof(dp));
//dp[0][0] = 0;
for (int i = 1; i <= n; i++)
{
for (int nPre = 0; nPre < nMax; nPre++)
dp[i][nPre >> 1] = max(dp[i - 1][nPre], dp[i][nPre >> 1]);
for (int nPre = 0; nPre < nMax; nPre++)
{
if (countBit(nPre >> 1) + 1 <= q)
dp[i][(nPre >> 1) | (nMax >> 1)] = max(dp[i][(nPre>>1) | (nMax>>1)], dp[i - 1][nPre] + value[i]);
}
}
int ans = 0;
for (int cur = 0; cur < nMax; cur++)
ans = max(ans, dp[n][cur]);
return ans;
}
int main()
{
while (~scanf("%d%d%d", &n, &m, &q))
{
for (int i = 1; i <= n; i++)
scanf ("%d", &value[i]);
cout << solve() << endl;
}
return 0;
}