题目描述 寒冬末日到来,未来科技有限公司在零下几十度的环境下艰难求生。 为了未来科技有限公司能够继续生存下去,员工们需要长时间努力劳作。公司在一条直线上设置了N个工作点供员工劳作。然而,习惯了末日前生活的员工常常会在劳作时偷懒,抑或寻求更短的劳作时间。因此,董事长王老菊安排了M个工头,通过工头喊一嗓子的方式激励或催促员工工作。但工头的能力毕竟是有限的,一个工头只能管理连续的K个工作点。 现在给出每个工作点的员工个数,董事长想知道,这些工头最多能够管理到多少员工?
如: 有10个工作点,3个工头,每个工头能管理连续2个工作点,而各工作点的员工数量是: 10 5 34 4 26 12 75 15 8 20 则最多能管理到167名员工。
输入格式 输入文件第一行有三个数N,M,K。如题所述。 接下来一行N个数,依次表示每个工作点里的员工个数。
输出格式 输出文件共一行一个数,表示工头最多能管理的员工人数。
样例 【输入样例】 7 4 1 2 43 32 4 64 1 10 【输出样例】 149 数据范围与提示 【数据规模】 30% 1 <= N, M, K <= 100 100% 1 <= N, M, K <= 1000 总人数在longint范围内。
#include<bits/stdc++.h>
using namespace std;
long long n,m,k,x;
long long s[1011];
long long f[1011][1011];
int main() {
freopen("manage.in","r",stdin);
freopen("manage.out","w",stdout);
cin >> n >> m >> k;
for(int i=1;i<=n;i++) {
cin >> x;
s[i]=s[i-1]+x;
}
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
f[i][j]=max(f[i-1][j],i>=k?f[i-k][j-1]+s[i]-s[i-k]:f[i-1][j]);
}
}
cout << f[n][m];
return 0;
}