zoukankan      html  css  js  c++  java
  • POJ 1976 A Mini Locomotive【DP】

    题意:给出一列火车,可以由三个火车头拉,每个火车头最多拉m节车厢(这m节车厢需要保持连续),再给出n节车厢,每节车厢的人数,问最多能够载多少人到终点。

    可以转化为三个长度相等的区间去覆盖n个数,使得这些数的和最大。

    用dp[i][j]表示前i个数用j个区间覆盖所得到的最大值,状态转移则为覆盖第i个数,或者不覆盖第i个数。

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring>  
     4 #include<algorithm>  
     5 using namespace std;
     6 
     7 
     8 int dp[50005][5],sum[50005];
     9 
    10 int main()
    11 {
    12     int ncase,n,i,j,ans,m;
    13     scanf("%d",&ncase);
    14     while(ncase--)
    15     {
    16         memset(dp,0,sizeof(dp));
    17         memset(sum,0,sizeof(sum));
    18         scanf("%d",&n);
    19         for(i=1;i<=n;i++)
    20         {
    21             scanf("%d",&ans);
    22             sum[i]=sum[i-1]+ans;
    23         }
    24         scanf("%d",&m);
    25         for(i=1;i<=n;i++)
    26         {
    27             for(j=1;j<=3;j++)
    28             {
    29                 if(i<=m*j) dp[i][j]=sum[i];//i小于可以覆盖得数字的总数,全部覆盖 
    30                 else
    31                 dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]);        
    32             }
    33         }
    34         printf("%d
    ",dp[n][3]);
    35     }
    36     return 0;
    37 }
    View Code

    参看的这一篇-http://www.cnblogs.com/tmeteorj/archive/2012/09/13/2683926.html

    话说读题的时候不认识passenger coaches(车厢)这个单词,以为是站台(可以有人上有人下),然后还在想为什么都没有说相应的乘客要到哪个站台下车----= =不知道想到哪儿去了---5555

    又-一次看题解---话说这样想不出来就看题解真的好么@_@

    go--go--

  • 相关阅读:
    cocos2d-x 3.0rc1 编译cpp-testsproject
    [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]
    教你摆脱低级程序猿 项目中cocopads的安装使用
    Android使用代码模拟HOME键的功能
    UVA 1508
    asp.net mvc5 安装
    Java_并发线程_Semaphore、CountDownLatch、CyclicBarrier、Exchanger
    crm操作产品实体
    BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)
    ADO与ADO.Net
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4298632.html
Copyright © 2011-2022 走看看