zoukankan      html  css  js  c++  java
  • codeforces #267 C George and Job(DP)

    职务地址:http://codeforces.com/contest/467/problem/C

    太弱了。。这题当时都没做出来。。思路是有的,可是自己出的几组数组总是过不去。。今天又又一次写了一遍。才发现当时一个地方脑残了。。每次选的最大值应该是与更新后的位置的前一个比而不是当前所在的位置。

    二维DP。

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    #define LL __int64
    LL dp[5001][5001], a[6000], b[6000];
    int main()
    {
        LL n, m, k, i, j, s;
        scanf("%I64d%I64d%I64d",&n,&m,&k);
        memset(dp,0,sizeof(dp));
        memset(b,0,sizeof(b));
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0;i<m;i++)
        {
            dp[m-1][1]+=a[i];
        }
        s=dp[m-1][1];
        for(i=0;i<n-m+1;i++)
        {
            b[i]=s;
            s=s-a[i]+a[i+m];
        }
        /*for(i=0;i<n-m;i++)
        {
            printf("%d ",b[i]);
        }*/
        for(i=1;i<n-m+1;i++)
        {
            for(j=k;j>=1;j--)
            {
                dp[i+m-1][j]=max(dp[i-1][j-1]+b[i],dp[i+m-2][j]);
            }
        }
        /*for(i=0;i<n;i++)
        {
            for(j=0;j<=k;j++)
            {
                printf("%d ",dp[i][j]);
            }
            puts("");
        }*/
        printf("%I64d
    ",dp[n-1][k]);
        return 0;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    hdu5289 RMQ+二分
    poj1459 最大流Dinic
    poj2391 最大流+拆点
    poj1087&&hdu1526 最大流
    NOI2004 郁闷的出纳员
    Treap入门(转自NOCOW)
    poj 2892
    vijos 1512
    对拍程序
    poj 3264
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4742559.html
Copyright © 2011-2022 走看看