题意:n个物品,要求任意连续长度为m的区间内最多只能选q个,求能选的最大价值(n<=1e3,m,q<=10)
dp[i][state] 前i个物品的最大选法,第i个物品是否选,取决于i-m+1..i-1的选法,m<=10 二进制记录m件物品的状态即可
#include <bits/stdc++.h>
using namespace std;
const int N=4e3+20;
int dp[N][N],w[N];
int check(int x)
{
int r=0;
while(x)
{
if(x&1)
r++;
x>>=1;
}
return r;
}
int main()
{
int n,m,q;
while(cin>>n>>m>>q)
{
for(int i=1;i<=n;i++)
cin>>w[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=0;j<(1<<m);j++)
{
int s=j>>1;
int x=check(s);//i-m+1..i-1有多少个1
if(x>q)
continue;
if(x<q)
dp[i][s+(1<<(m-1))]=max(dp[i][s+(1<<(m-1))],dp[i-1][j]+w[i]);
if(x<=q)
dp[i][s]=max(dp[i][s],dp[i-1][j]);//不选
}
}
int ans=0;
for(int i=0;i<=(1<<(m));i++)
ans=max(ans,dp[n][i]);
cout<<ans<<endl;
}
return 0;
}