zoukankan      html  css  js  c++  java
  • 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;
    }
    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    javascript金额千分位的实现
    html中仿GroupBox效果与路径问题
    javascript获取表格的高度
    分布式系统的架构思路
    sharepoint2010 Reporting Services 集成注意
    Ext.MessageBox.updateProgress
    认识RFID
    Extjs 下拉ComboBox分页,图片,多行显示
    MVCFckEditor一些小问题
    MVCFckEditor
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/4993163.html
Copyright © 2011-2022 走看看