P3399 丝绸之路(DP)
题目背景
张骞于公元前138年曾历尽艰险出使过西域。加强了汉朝与西域各国的友好往来。从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚、西亚和欧洲,将那里的香料、良马传进了我国。每当人们凝望荒凉的大漠孤烟,无不引起对往日商贸、文化繁荣的遐想……
题目描述
小仓鼠带着货物,从中国送到安息,丝绸之路包括起点和终点一共有N+1个城市,0号城市是起点长安,N号城市是终点巴格达。要求不超过M天内必须到达终点。一天的时间可以从一个城市到连续的下一个城市。从i-1城市到i城市距离是Di。
大家都知道,连续赶路是很辛苦的,所以小仓鼠可以在一个城市时,可以有以下选择:
移动:向下一个城市进发
休息:呆在原来的城市不动
沙漠天气变化无常,在天气很不好时,前进会遇到很多困难。我们把M天的第j(1<=j<=M)天的气候恶劣值记为Cj。从i-1城市移动到i城市在第j天进发时,需要耗费Di*Cj的疲劳度。
不过小仓鼠还是有选择权的,可以避开比较恶劣的天气,休息是不会消耗疲劳值的。现在他想知道整个行程最少要消耗多少疲劳值。
输入输出格式
输入格式:
第一行2个整数N,M
连续N行每行一个整数Dj
连续M行每行一个整数Cj
输出格式:
一个整数,表示最小疲劳度
输入输出样例
题意:就是从原点到终点的n+1个城市穿越任务要在m天内完成,必须按给出的城市顺序来完成整个路程,两个城市之间有间距,在这m天中每天会有一个恶劣值,城市之间的距离乘与这一天的恶劣值是这个疲劳度,求出来穿越所有城市后这个疲劳度的最小值
解法:
相比于P1280 尼克的任务,它们之间的区别就是,合唱队形那一个时刻要做什么事情已经是固定的了,这样你就可以直接以一维dp来写出答案
而这一道题,他只给我们说我们要在m天内走过这么多个城市,而没有固定什么时候走,这就要多加一个维度来判断那一天走这个城市比较合适
那么我们在dp某个位置的值肯定要由他的上一个维度,和它这个维度的前面的值来得到(我习惯这样考虑)
而且我每一个维度的值肯定是非严格递减(因为我们要求最小疲劳度)
我们肯定是要走n+1个城市,但是我们开始就在原点城市,所以只需要枚举n个就行
这n个城市在一定要以递增的形式枚举
简单说:
这个二维的列坐标是代表应该走过前几个城市,那个二维的行坐标就是表示在这个天数(这个天数是一维枚举的)要走列坐标数目的城市
例如:
用i表示列,j表示行
dp[i][j]表示在前j天内走过i个城市所需要的最小疲劳度
这样写的话,一个dp[i][j]值得确定,要由它的
1、(dp[i-1][j-1](因为它的每一个一维上面是递减的,所以越靠后疲劳度越小)+(j天去城市)*(之前城市与现在这个城市之间的距离))
和
2、dp[i][j-1](也就是上一个值)
决定,只需要取他们的最小值就行
当枚举到他的天数小于它要经过的城市数的时候就不用管它,刚好够的时候就一个一个对应相乘再相加
这样当他的 j(天数)大于 i(要经过城市数) 的时候,我们就要去试探不让第j-1天去经过第i个城市,转而让第j天去经过它,会不会疲劳度更小,在让它之前的城市去上一维找最小疲劳值
上代码吧:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1005;
7 int D[maxn],C[maxn],dp[maxn][maxn];
8 int main()
9 {
10 int n,m;
11 scanf("%d%d",&n,&m);
12 for(int i=1;i<=n;++i)
13 scanf("%d",&D[i]);
14 for(int j=1;j<=m;++j)
15 scanf("%d",&C[j]);
16 for(int i=1;i<=n;++i)
17 {
18 for(int j=i;j<=m;++j)
19 {
20 if(j!=i)
21 dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+C[j]*D[i]);
22 else dp[i][j]=dp[i-1][j-1]+C[j]*D[i];
23 }
24 }
25 printf("%d\n",dp[n][m]);
26 }
P3399 丝绸之路(DP)的更多相关文章
- 洛谷10月月赛Round.1| P3399 丝绸之路 [DP]
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- P3399 丝绸之路 dp
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- P3399 丝绸之路(线性二维dp)
P3399 丝绸之路 题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚. ...
- 【题解】洛谷P3399 丝绸之路
我丑,话说在前头 题目: https://www.luogu.org/problemnew/show/P3399 一道挺简单的DP 思路不难想 但是蒟蒻总是写错初始化啥的 思路 定义f[i][j]为第 ...
- P3399 丝绸之路
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- 洛谷 P3399 丝绸之路
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- 动态规划dp专题练习
貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...
- The first DP!
P3399 丝绸之路 题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚. ...
- 简单DP【p3399】丝绸之路
Background 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲 ...
随机推荐
- 图片质量评估论文 | 无监督SER-FIQ | CVPR2020
文章转自:同作者微信公主号[机器学习炼丹术].欢迎交流,共同进步. 论文名称:SER-FIQ: Unsupervised Estimation of Face Image Quality Based ...
- 【Flutter】可滚动组件简介
前言 当组件内容超过当前显示视口(ViewPort)时,如果没有特殊处理,Flutter则会提示Overflow错误.为此,Flutter提供了多种可滚动组件(Scrollable Widget)用于 ...
- 【Linux】同时插入多行数据到文本文件中
如果想同时插入多行数据到指定的文本中,可以用下面的命令EOF cat >> test.txt <<EOF 1234 5678 GOOD EOF 将上述3行插入到 test.tx ...
- 【Oracle】11G 11.2.0.4 RAC环境打补丁
一.准备工作 1,数据库环境 操作系统版本 : RedHat 7.2 x64 数据库版本 : Oracle 11.2.0.4 x64 RAC Grid : 11.2 ...
- 【DBA】非常好的一个脚本网站
今天无意间发下了一个特别好的一个oracle脚本的网站.网站地址如下: https://oracle-base.com/dba/scripts 里面都是一些非常实用的脚本.
- 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)
题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...
- springboot项目启动并立即执行自定义程序内容
第一种:实现ApplicationRunner接口,重写其中的run()方法: 第二种:实现CommandLineRunner接口,重写其中的run()方法: 还有第三种...
- Git 创建新分支检查分支
创建分支和切换分支,也可以称为检出分支 创建新分支 git branch branchName 切换到新分支 git checkout branchName 上面两个命令也可以合成为一个命令: git ...
- windows 系统 MySQL_5.6.21安装教程
1.双击安装文件 mysql_installer_community_V5.6.21.1_setup.1418020972.msi,等待安装界面出现,见下图: 2.勾选:I accept thel ...
- Java int和integer有什么区别 (mybatis踩坑)
不要在实体类中使用int 我们都知道Integer是int的包装类,而int是基本数据类型.所以Integer类型的变量会初始化为null,int类型则会被初始化为0 . 所以在下面的动态拼接例子中: ...