A Mini Locomotive(动态规划 01)

 /*

 题意:选出3个连续的 数的个数  为K的区间,使他们的和最大

分析: dp[j][i]=max(dp[j-k][i-1]+value[j],dp[j-1][i]);

dp[j][i]:从j个数种选出i个连续区间  数值的最大和

value[j]:第j个区间内的数的和

和背包有点像,但要活用

*/

#include <cstdio>

#include <cstring>

#include <iostream>

using namespace std;

int dp[50005][4];

int main()

{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        int n;

        scanf("%d",&n);

        int a[n+1],sum[n+1];

        memset(dp,0,sizeof(dp));

        memset(a,0,sizeof(a));

        memset(sum,0,sizeof(sum));

        for(int i=1; i<=n; i++)

        {

            scanf("%d",&a[i]);

            sum[i]=sum[i-1]+a[i];//前缀和,用于求连续k个数的和

        }

        int k=0;

        scanf("%d",&k);

        int value[n+1];

        memset(value,0,sizeof(value));

        for(int i=1; i<=k; i++)

            value[i]=value[i-1]+a[i];

        for(int i=k+1; i<=n; i++)

            value[i]=sum[i]-sum[i-k];//连续k个数的和,value[i]代表区间长度为k的第i个区间

        for(int j=k; j<=n; j++)

            for(int i=1; i<=3; i++)

                dp[j][i]=max(dp[j-k][i-1]+value[j],dp[j-1][i]);//从j个数中选出i个区间,若选第i个区间,就相当于从前(j-k)个数中选出(i-1)个区间的基础上再加此区间(value[j]),若不选就是相当于在(j-1)个数中选i个区间

            printf("%d\n",dp[n][3]);

    }

    return 0;

}

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

POJ3274(哈希)

第一篇博客emmm根据kuangbin  dalao的poj刷题指南做的一道不是很简单的哈希题目题意是求特征之和相同的第i头牛到第j头牛的max(ji)一开始是没有思路的,苦思冥想半天然后(看了题解以后)手推公式:num\i\\1\...num\j\\1\num\i\\2\....num\j\

java实现九九乘法表的输出

这是小学二年级令人难忘的坷如今以java程序的行式展示,真不戳!publicclassscore{publicstaticvoidmain(Stringargs){inti,j;for(i1;i<9;i){for(j1;j<9;j

人工智能数学基础-线性代数4:矩阵及矩阵运算

一、矩阵定义矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,定义如下:由m×n个数aij排成的m行n列的数表称为m行n列的矩阵,简称m×n矩阵。记作:这m×n个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数aij为(i,j)元的矩阵可记为(aij)或(aij)m×n,m×