zoukankan      html  css  js  c++  java
  • Codeforces 467C George and Job(DP)

    题目

    Source

    http://codeforces.com/contest/467/problem/C

    Description

    The new ITone 6 has been released recently and George got really keen to buy it. Unfortunately, he didn't have enough money, so George was going to work as a programmer. Now he faced the following problem at the work.

    Given a sequence of n integers p1, p2, ..., pn. You are to choose k pairs of integers:

    [l1, r1], [l2, r2], ..., [lk, rk] (1 ≤ l1 ≤ r1 < l2 ≤ r2 < ... < lk ≤ rk ≤ n; ri - li + 1 = m), 
    in such a way that the value of sum is maximal possible. Help George to cope with the task.

    Input

    The first line contains three integers n, m and k (1 ≤ (m × k) ≤ n ≤ 5000). The second line contains n integers p1, p2, ..., pn (0 ≤ pi ≤ 109).

    Output

    Print an integer in a single line — the maximum possible value of sum.

    Sample Input

    5 2 1
    1 2 3 4 5

    7 1 3
    2 10 7 18 5 33 0

    Sample Output

    9

    61

    分析

    题目大概说给一个序列,求k个不重叠长m的连续子序列的最大和。

    DP搞了。

    • dp[i][j]表示前i个数中构成j个子序列的最大和
    • 转移就是dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]),sum是前缀和

    代码

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    long long d[5555][5555],sum[5555];
    int a[5555];
    int main(){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1; i<=n; ++i) scanf("%d",a+i),sum[i]=sum[i-1]+a[i];
        for(int i=1; i<=n; ++i){
            for(int j=1; j<=k; ++j){
                if(j*m>i) break;
                d[i][j]=max(d[i-1][j],d[i-m][j-1]+sum[i]-sum[i-m]);
            }
        }
        printf("%lld",d[n][k]);
        return 0;
    }
    
  • 相关阅读:
    ArcEngine 一些实现代码(转载)
    关于GIS支持的地理数据源的命名空间
    SpringBoot-Web配置
    RedisGeo
    JedisCluster
    Java并发编程:Lock
    java并发编程:线程变量-ThreadLocal类
    java并发编程:线程池-Executors
    解决Mybatis配置ORM映射 时分秒都为0
    Kafka的存储机制以及可靠性
  • 原文地址:https://www.cnblogs.com/WABoss/p/5771224.html
Copyright © 2011-2022 走看看