算法:poj 1976 A Mini Locomotive (dp 二维01背包)

题目大意:

某个车站有N个火车车厢,编号为1~N,每个车厢上有xi个人。

这个车站还有 三个火车头,他们能拉最多m个车厢(m<=N/3),而且这m个车厢的编号要连续的。问这三个火车头最多 能拉多少个人。

思路:

因为m<=N/3, 所以按照贪心的思想,为了拉更多的人,每个火车 头一定是要拉m个连续的车厢。

然后,为了求某段连续的车厢共有多少人,可以前缀和预处理, 某 一段和=sum[ i ] - sum[ i-m].

f[i][j] 代表前i个车厢,用j个火车头拉,最多能拉多少人。

对于第i个车厢,如果当前这个车头选择要拉这个车厢,那么要把以i为最后一个车厢的连续m个车厢 一起拉,所以状态转移方程是:

f[i][j] = max(f[i-1][j], f[i-m][j-1]+sum[i]-sum[i- m]);

代码:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<string>
#define MP make_pair
#define SQ(x) ((x)*(x))  

using namespace std;
typedef long long int64;  

const double PI = acos(-1.0);
const int MAXN = 50010;
const int INF = 0x3f3f3f3f;
int n, m;
int w[MAXN], sum[MAXN];
int f[MAXN][4];  

int main(){  

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

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

        scanf("%d", &m);  

        memset(f, 0, sizeof(f));  

        for(int i=m; i<=n; ++i){
            for(int j=3; j>=1; --j){
                f[i][j] = max(f[i-1][j], f[i-m][j-1]+sum[i]-sum[i-m]);
            }
        }  

        printf("%d\n", f[n][3]);
    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 题目
, 火车头
, 二维
, 火车入轨算法
背包
二维dp、二维背包问题、二维背包、二维费用的背包问题、动态规划二维背包问题,以便于您获取更多的相关知识。

时间: 2024-10-31 15:18:50

算法:poj 1976 A Mini Locomotive (dp 二维01背包)的相关文章

算法:poj 1948 Triangular Pastures (dp 二维01背包)

题目大意: 给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上. 思路: 对于已知周长的三角形,我们只要知道两条边的长度变可推出第三条边,所以可以得 到状态方程: f[i][j][k] 表示用前i条边,能否组成长度为j和k的两条边 初始化f[0][0][0] = true: f[i][j][k] = f[i-1][j-len[i]][k] || f[i-1][j][k-len[i]]; 如果f[i][j][k]=true ,那么就计算以j,k,sum-j-k为三条边能否组成三

算法:HDU 2126 Buy the souvenirs (dp 二维01背包)

题目大意: 有n(0<n<=30)件物品,每件物品的价格是Pi,要用m(0<=m<=500)块钱去 买这些物品,要求买尽量多数量的物品,问买最多数量的物品共有多少总方案? 思路: 这题 还是比较容易想到的 f[i][j][k], 表示前i个物品,用费用j,买k个物品共有多少个方案 得到 状态转移方程: f[i][j][k] += f[i-1][j-c[i]][k-1]; 初始化f[0][0][0] = 1 代码: #include<iostream> #include&

poj 1976 A Mini Locomotive(0/1背包)

点击打开链接poj 1976 思路: 0/1背包 分析: 1 题目给定n个数,要求三段连续的m个数之和最大 2 假设n个数是num[1],num[2],num[3]......num[n],那么m个连续的数可能有n-m+1种可能即num[1]+num[2]...+num[k] , num[2]+num[3]...+num[k]...... 3 我们令v[1] = num[1]+num[2]...+num[k] , v[2] = num[2]+num[3]...+num[k].那么总的有n-m+1

POJ 1976 A Mini Locomotive

题意:给出n车厢以及n节车厢内的人数 现有三节迷你火车头 每个火车头可以拉连续的m节车厢 问三个火车头最多可以拉多少人. dp[i][j]表示第i节车厢有j个车头可以拉的总人数 dp[i][j]=max(dp[i-1][j],dp[k][j-1]+a[i]-a[k]) k=max(i-m,0) 前一个表示该节车厢不拉 后一状态表示加一个火车头拉 #include <iostream> #include<cstdio> #include<cstring> using na

算法:POJ 2184 Cow Exhibition (dp 转换01背包)

题目大意: 有N个物品,每个物品有属性Si和Fi,-1000 <= Si, Fi <= 1000, 每种物品最 多只能选一次,问怎样选使得物品的所有Si和Fi属性之和最大,并且要求Si之和与Fi之和都不能下于 0. 思路: 这题想了很久都没思路,于是跟前辈请教了下,恍然大悟.把属性Si当做是物品的 费用,Fi当做是价值,然后做01背包即可. 代码: #include<iostream> #include<queue> #include<stack> #inc

poj 1948 Triangular Pastures(二维0/1背包)

点击打开链接poj 1948 思路: 二维0/1背包 分析: 1 题目要求从n个木棒里面选出m个组成一个三角形,使得三角形的面积最大 2 对于三角形来说知道了两条边和周长就可以求面积,按照0/1背包的思想dp[i][j][k]表示前i个木棒能否组成第一条边为长度j,第二条长度为k.如果dp[j-v[i]][k] 或dp[j][k-v[i]] 为true则dp[j][k]就为true 3 我们求出了所有可能的组合之和,就去枚举所有的边长的情况,然后求最大的面积 代码: #include<cmath

算法:poj 3628 Bookshelf 2(dfs, 01背包)

题目大意: 有n个数字(1-100W),现在有一个数b,1<=b<=s(s为n个数字之和).要从n 个数字中选择一些数字组合,有一写组合的数字之和x会大于等于b, 求所有x中x-b最小的是多少? 思路: 刚开始看到这题,发现数字这么大,以为内存不够不能用背包.而n最大才20,所以直接用 dfs+减枝0MS过了... 然后用背包,开了2000W+的数组,memset初始化,果断地MLE了...然后 看了下discuss,发现用memset会增加很多额外的内存. 于是改用for循环初始化,内存就够

PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解

数据结构很重要,算法+数据结构+文档=程序使用PHP描述冒泡排序算法,对象可以是一个数组 复制代码 代码如下: //冒泡排序(数组排序)function bubble_sort($array) { $count = count($array); if ($count <= 0) return false; for($i=0; $i<$count; $i++){ for($j=$count-1; $j>$i; $j–){ if ($array[$j] < $array[$j-1]){

c++ 关于二维曲线数据处理算法的问题

问题描述 c++ 关于二维曲线数据处理算法的问题 一条二维曲线数据,数据大概3万个,现在将它所有的波峰值和波谷值分别连起来了,就是两条曲线,因为数据的原因,曲线的形状会像正弦曲线一样弯弯曲曲,也就是说当在两个比较大的峰值之间会有一些比较小的峰值,想要将这些小的峰值去掉,最后绘制出来的两条峰峰值,一条是形似倒V,一条形似正V,应该怎样写这个算法 解决方案 你这个因为是数据的原因,所以你要祛除噪声,但是按照你的需求怎么感觉想把数据变成回归的问题呢,那你直接用数据拟合一个函数,完后画函数应该也行 解决