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\n",dp[n][3]);
35     }
36     return 0;
37 }

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

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

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

go--go--

时间: 2024-11-06 11:55:26

POJ 1976 A Mini Locomotive【DP】的相关文章

poj 2411 Mondriaan&#39;s Dream 【dp】

题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案. 分析:这是一个比较经典的题目,网上各种牛B写法一大堆.题解也是 我们可以定义状态:dp[i][st]:在第 i 行状态为 st 的时候的最大方案数. 然后转移方程:dp[i][st] = sum (dp[i-1][ss]) 即所有的当前行都是由上一行合法的状态转移而来. 而状态的合法性由两种铺法得到,第一种横放,注意要求前一行全满,然后竖放,上一行为空

POJ 1080 Human Gene Functions 【dp】

题目大意:每次给出两个碱基序列(包含ATGC的两个字符串),其中每一个碱基与另一串中碱基如果配对或者与空串对应会有一个分数(可能为负),找出一种方式使得两个序列配对的分数最大 思路:字符串动态规划的经典题,很容易想到状态dp[i][j],指第一个长度为i的串和第二个长度为j的串配对的最大分数.显然,这个状态可以由dp[i][j-1],dp[i-1][j],dp[i-1][j-1]三个子问题得到,即第一串最后一个字符对应空格.第二串最后一个字符对应空格和第一串第二串最后一个字符配对所得到的分数这三

poj 44 字串和【dp】

子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数)每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素.(0<n<=1000000) 输出 对于每

poj 3666 Making the Grade 【dp】

题目链接:http://poj.org/problem?id=3666 题意:使得一个序列变为递增或递减序列的最小代价.代价为题中给的公式. 解法:dp[i][j]表示前i个数,以num[j]为末尾的最小代价. 更新的时候枚举 j 转移状态: for (int i = 2; i <= n; i++) { int t = inf; for (int j = 1; j <= n; j++) { t = min(t,dp[i-1][j]); dp[i][j] = t + abs(a[i] - num

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()

POJ 8471 切割回文 【dp】【北大ACM/ICPC竞赛训练】

1 #include<iostream> 2 #include<vector> 3 #define INF 100000 4 using namespace std; 5 6 string s; 7 char a[1005]; 8 vector<int> hui[1005];//hui[i]里的k指 k到i组成回文 9 int dp[1005];//dp[i]代表前i个字符要切几刀 10 11 int main(){ 12 int t; cin>>t; 13

poj 3009 Curling 2.0 【DFS】

题意:从2出发,要到达3, 0可以通过,碰到1要停止,并且1处要变成0, 并且从起点开始沿着一个方向要一直前进,直至碰到1(或者3)处才能停止,(就是反射来反射去知道反射经过3).如果反射10次还不能到达3,就输出-1. 策略:深搜. 易错点,方向不容易掌握,并且,出题人把n, m顺序反了. 代码: #include<stdio.h> #include<string.h> int map[25][25]; int ans, n, m; const int dir[4][2] = {

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1