标签:
#include<iostream> using namespace std; #include<cstdio> #include<cstring> int n,m,k; #define N 1010 int f[N][N],s[N]={0}; int ans=0; int main() { freopen("manage.in","r",stdin); freopen("manage.out","w",stdout); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;++i) { scanf("%d",&x); s[i]=s[i-1]+x; } memset(f,0,sizeof(f)); for(int i=1;i<=n;++i)/*类似于背包问题*/ for(int j=1;j<=m;++j) for(int l=1;l<=k&&i-l>=0;++l)/*对于f[i][j]表示的是前i个集会,j个警察所能管理的最大人数*/ f[i][j]=max(f[i-1][j],f[i-l][j-1]+s[i]-s[i-l]);/*f[i][j]是第i个集会管还是不管,不管就是f[i-1][j],f[i-l][j-1]+s[i]-s[i-l]表示的第j个警察,管理l个集会,为什么不是管理k个呢?因为i-k有可能越界*/ cout<<f[n][m]<<endl; fclose(stdin); fclose(stdout); return 0; }
标签:
原文地址:http://www.cnblogs.com/c1299401227/p/5487604.html