POJ 1976 A Mini Locomotive

$dp$。

要求选择$3$个区间,使得区间和最大。$dp[i][j]$表示前$i$个数中选择了$j$段获得的最大收益。

#include <cstdio>
#include <cmath>
#include <set>
#include <cstring>
#include <algorithm>
using namespace std;

int T,n,k;
int dp[50010][5];
int a[50010];

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);

        memset(dp,0,sizeof dp);

        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++) a[i]=a[i]+a[i-1];

        scanf("%d",&k);

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=3;j++)
            {
                if(i-k>=0) dp[i][j] = max(dp[i-1][j] , dp[i-k][j-1]+a[i]-a[i-k]);
            }
        }

        printf("%d\n",dp[n][3]);
    }
    return 0;
}
时间: 2024-10-05 06:44:17

POJ 1976 A Mini Locomotive的相关文章

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<a

POJ1976A Mini Locomotive(01背包装+连续线段长度)

A Mini Locomotive Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2485   Accepted: 1388 Description A train has a locomotive that pulls the train with its many passenger coaches. If the locomotive breaks down, there is no way to pull the

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[

zoj 2501 - A Mini Locomotive

题目:有一串数,从里面取出m个不同的区间,每个区间长度不能超过M,使得所取所有数字和最大. 分析:dp,单调队列,区间最大字段和.因为数据都是正的不需要单调队列维护(否则要使用). 区间最大字段和,求出每个元素作为结束标志的前k项和:取结束位置作为dp状态: 然后,利用单调队列维护区间长度,O(1)时间查找满足长度的最小的前j项和,做差即可. 状态:设f(i,j)为前j个数字,取i个区间最大和:s(j)为前j个数字的最大单区间字段和: 转移:f(i,j)= max(f(i-1,k)+ s(j))

poj 01背包

首先我是按这篇文章来确定题目的. poj3624 Charm Bracelet 模板题 没有要求填满,所以初始化为0就行 #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<cstring> using namespace std; int w[3403]; int h[3403]; int n,m; int dp[12880+9]; i

POJ之01背包系列

poj3624 Charm Bracelet 模板题 没有要求填满,所以初始化为0就行 #include<cstdio> #include<iostream> using namespace std; #define N 15010 int n,m,v[N],c[N],f[N]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&am

HOJ 题目分类

转自:http://blog.sina.com.cn/s/blog_65f3869301011a1o.html ******************************************************************************* 简单题(包括枚举,二分查找,(复杂)模拟,基础数据结构(栈.队列),杂题等 ****************************************************************************

Poj 1741 Tree (树的分治)

题目链接: Poj 1741 Tree 这个题目Tle的好苦啊,原来一直是树的重心没找对,Tle好长时间,终于对了,好感动,先贴个代码. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 10010; 8 struct node 9 { 10 int

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物