Hiho 1044
题意:
有n个座位连续分布,现在给出限制条件m个连续座位上最多可以打扫q个位置,问最多能打扫多少垃圾。
思路:
对于前面的状态枚举每一种可能,对于当前状态只有两种选择,分别计算即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int n,m,q;
int dp[maxn][1<<10];
int a[maxn];
int num(int x)
{
int ans = 0;
while(x) {
if(x&1) ans++;
x >>= 1;
}
return ans;
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&q);
for(int i = 1;i <= n; i++) {
scanf("%d",&a[i]);
}
int ans = 0;
for(int i = 1;i <= n; i++) {
for(int j = 0;j < (1<<m); j++) {
int x = (j>>1)+(1<<(m-1));
int y = j>>1;
int num1 = num(x);
int num2 = num(y);
if(num1 <= q) {
dp[i][x] = max(dp[i][x],dp[i-1][j] + a[i]);
}
if(num2 <= q) {
dp[i][y] = max(dp[i][y],dp[i-1][j]);
}
}
}
for(int i = 0;i < 1<<m; i++) ans = max(ans,dp[n][i]);
printf("%d\n",ans);
return 0;
}