codeforces 467CGeorge and Job

来源:互联网 发布:bilibili mac电脑直播 编辑:程序博客网 时间:2024/05/15 19:42

dp[i][j]: 前 i 个数中,选择 j pairs 可以获得的最大和。

     sum[i] = a[1] + a[2] + .....+a[i];

     那么对于第 i 个数来说,有不选和选择的两种情况。

     1.如果不选第 i 这个数 ,即dp[i-1][j],表示前 i 个数,选择 j pairs 获得的最大和 = 前i-1个数中选择 j pairs 可以获得的最大和;

     2.如果选第 i 个数,状态就转移到 dp[i-m][j-1] + sum[i] - sum[i-m],这个 sum[i]- sum[i-m] 会成为新的一个pair,前面那个第 i-m 个数就不要选。

/**************************************************************** *Author:fisty *Data:2014-10-12 *codeforces 467C  *DP   dp[i][j] = max(dp[i-1][j] , dp[i-m][j-1] + sum[i] - sum[i-m] ); *****************************************************************/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX_N 5050int n,m,k;//   0 <= p <= 10^9long long sum[MAX_N];long long dp[MAX_N][MAX_N];        int main(){        //freopen("in", "r", stdin);        while(scanf("%d%d%d", &n, &m, &k) != EOF){                memset(dp, 0LL, sizeof(dp));                sum[0] = 0;                int t;                for(int i = 1;i <= n; i++){                        scanf("%d", &t);                        sum[i] = sum[i-1] + t;                }                for(int i = m;i <= n ; i++){                        for(int j = 1; j<=k && j<=i/m; j++){                                dp[i][j] = max(dp[i-1][j], dp[i-m][j-1] + sum[i] - sum[i-m]);                        }                }                printf("%I64d\n", dp[n][k]);        }        return 0;}



0 0
原创粉丝点击