• 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 ",dp[n][3]);
     
     
     
        }
     
        return 0;
    }
    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    误删本地分支,两天的工作量差点毁于一旦,使用git reflog 有惊无险恢复
    单点登录SSO
    IdentityServer4介绍和使用
    常见的远程无线通信技术
    4G模块和DTU模块有何区别
    以太网IO控制器
    什么是无线网关,无线网关的功能
    什么是IOT网关,网关功能有哪些
    Modbus RTU和Modbus TCP的两种区别
    数据采集网关设备 如何选择数据采集网关
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/4993163.html
Copyright © 2020-2023  润新知