Laoj P1288 最小乘车费用


问题背景

简单线性DP

试题描述

假设某条街上每一公里就有一个公共汽车站,并且一种可能的乘车费用如下表:
公里数 1 2 3 4 5 6 7 8 9 10
费用 12 21 31 40 49 58 69 79 90 101
而任意一辆汽车从不行驶超过10公里。某人想乘车到达n公里远的地方,假设他可以任意次换车,请你帮他找到一种乘车方案,使得总费用最小。
注意:10公里的费用比1公里小的情况是允许的。

输入格式

共两行。第一行为10个不超过200的整数,依次表示行驶1~10公里的费用,相邻两数间用一个空格隔开;第二行为某人想要乘车的公里数(不超过20000的整数)。

输出格式

仅一行,包含一个整数,表示到达n公里所需要的最小费用。

输入示例

12 21 31 40 49 58 69 79 90 101
15


输出示例

147

【分析】

dp入门,水题。

【代码】

 1 #define mem(a, b, c) for(int i=1;i<=c;++i) a[i]=b;
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4
 5 int n, a[20], dp[20020];
 6
 7 int main() {
 8     for (int i=1;i<=10;++i)
 9         cin >> a[i];
10     cin >> n;
11     mem(dp, 0x7fffffff, n);
12     for (int i=1;i<=n;++i)
13         for (int j=1;j<=min(10, i);++j)
14             dp[i]=min(dp[i], dp[i-j]+a[j]);
15     cout << dp[n] << endl;
16 }
时间: 2024-11-05 14:55:09

Laoj P1288 最小乘车费用的相关文章

RQNOJ 169 最小乘车费用:水dp

题目链接:https://www.rqnoj.cn/problem/169 题意: 给出行驶1-10公里的费用(所有车一样),可以倒车,问行驶n公里的最小费用. 题解: 大水题... (=′ω`=) 表示状态: dp[i] = min cost i:行驶了i公里 找出答案: ans = dp[n] 如何转移: now: dp[i] dp[i+j] = min dp[i] + c[j] 枚举倒车行驶j公里 边界条件: dp[0] = 0 others = -1 AC Code: 1 // stat

HDU1827 Summer Holiday(强连通+缩点+最小传递费用)

题意:给出人物关系图,要把一个通知告诉所有人,告诉每一个人有一个费用,现在想知道最小通知的人与费用. 思路:利用Tarjan算法,对原图进行缩点,然后找出入度为0 的点,那么这个人是必须要通知的,由于经过缩点,所以,如果这个点是缩点来的,那就枚举下这个点里的任一个点,找到最小的费用点. #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<set

[DP训练]rqnOJ

P188 购物问题 题目梗概: n个物品,其中每个物品价格xi,但是某两个物品不能同时购买. 问最大的价格是多少? 思考与理解: 一开始并没有想到树形背包DP,只是一直在想是不是分组背包~ 在之后瞅了瞅题解的思路之后,恍然大悟. 先把有限制的物品之间的关系转换为父子关系就可以进行DP了. 对于每个有限制的物品要不选 要么不选 选的话会有什么结果 不选的话有什么结果. 如果没有限制的话 那么肯定是要买的~ #include <cstdio> #include <algorithm>

背包问题--(一本通)课后训练

1.打包 /*一个二维01背包 样例输入: 6 5 4 10 2 2 20 3 2 40 4 3 30 3 3 样例输出: 50 */ #include<iostream> using namespace std; #include<cstdio> #define N 381 int f[N][N]; int n,V,G; struct Wp{ int t,v,g; }; Wp wp[N]; void input() { scanf("%d%d%d",&

bzoj1834:最大流+最小费用最大流

为什么昨天看的时候就一直看不懂,果然智商是硬伤...然后今晚一看就懂了OrzOrz,关键是限制容量那个技巧... -------------------------------------------------------------------------------------------- #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<

poj 2516 最小费用最大流

Language: Default Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 14334   Accepted: 4908 Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (m

HDU 4862 Jump (2014-多校1-1002,最小K路径覆盖,最小费用最大流)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=4862 题意: 给你一个n*m的矩阵,填充着0-9的数字,每次能从一个点出发,到它的右边或者下边的点,花费为|x1-x2|+|y1-y2|-1,如果跳跃的起点和终点的数字相同,则获得这个数字的收益,不能走已经走过的点 有K次重新选择起点的机会 如果可以走遍所有点,则输出最大的价值(收益-花费) 否则,输出-1 方法: 最小K路径覆盖,最小费用最大流 建图: 每个点拆为2点:X部和Y部,(a,b)表示流量

HDU4067 Random Maze(最小费用最大流)

题目大概说,给一张图,删除其中一些单向边,使起点s出度比入度多1,终点t入度比出度多1,其他点出度等于入度.其中删除边的费用是bi,保留边的费用是ai,问完成要求最小的费用是多少. 一开始我想到和混合图欧拉回路(POJ1637)的类似构造方法: 假设所有边一开始都是保留的,算出各个点的入度和出度,另外s点的出度-1,t点的入度-1: 然后把出度-入度等于正数的点源点向其连一条容量为出度-入度的边,等于负数的点其向汇点连一条容量为入度-出度的边 这样就是要通过删除边使那些与源汇相连的边满流,这样就

最小费用最大流2

#include <stdio.h> #include <iostream> #include <string.h> #include<cmath> using namespace std; const int N=300; const int MAXE=200000; const int inf=1<<30; int head[N],ep; int d[N],pre[N]; bool vis[N]; int q[MAXE]; struct Ed