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  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示