Fork me on GitHub

Codeforces Round #267 Div2 C George and Job --DP

题意:把长度为n的序列分成k个m长的连续小序列,这些连续小序列的和最大是多少。

解法:显然DP。

定义: dp[i][j] 为前 i 个元素分成j个m端,且 i 是第j个的末尾的最大和。

那么有: dp[i][j] = max(dp[i-1][j], dp[i-m][j-1]+sum[i]-sum[i-m])

5000*5000的空间,是有点大。。

代码:

复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define lll __int64
using namespace std;

lll dp[5002][5001];
lll a[5002],sum[5003];

int main()
{
    int n,m,k;
    int i,j;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        sum[0] = 0;
        for(i=1;i<=n;i++)
        {
            scanf("%I64d",&a[i]);
            sum[i] = sum[i-1]+a[i];
        }
        for(i=0;i<=n;i++)
            for(j=0;j<=k;j++)
                dp[i][j] = 0;
        for(i=m;i<=n;i++)
        {
            dp[i][0] = max(dp[i][0],dp[i-1][0]);
            for(j=1;j<=k;j++)
            {
                dp[i][j] = max(dp[i][j],dp[i-1][j]);
                dp[i][j] = max(dp[i][j],dp[i-m][j-1]+sum[i]-sum[i-m]);
            }
        }
        cout<<dp[n][k]<<endl;
    }
    return 0;
}
View Code
复制代码

 

posted @   whatbeg  阅读(231)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示