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年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲 ...
随机推荐
- python函数2-函数参数
rgb法则:
- k8s中教你快速写一条yaml文件
一条yaml中有很多字段,如果去背这些字段,其实也能背过,但是去写一条yaml,也往往浪费很多的时间,也会出错,其实我们可以用一条命令就能快速来写一段自定义的yaml,工作中去修改相应的yaml也得心 ...
- pg_rman的安装与使用
1.下载对应数据库版本及操作系统的pg_rman源码 https://github.com/ossc-db/pg_rman/releases 本例使用的是centos6.9+pg10,因此下载的是pg ...
- bootstrap弹出层嵌套弹出层后文本框不能获得焦点输入
如图上 我从页面打开一个bootstrap弹出层 然后又在 bootstrap弹出层的基础上打开一个layui的弹出层 打开后发现文本域获取不到焦点不能输入内容 而该弹出层显示的层级体现出来了 按钮 ...
- SUGA
愿试炼的终点是花开万里 愿以渺小启程伟大结束 ----闵玧其
- C++中输出变量类型的方法
C++中输出变量类型的方法 在c++中输出变量或者数据类型,使用typeid().name()的方法.如下例子: #include <iostream> #include <stri ...
- jmeter-并发及常数吞吐量定时器设定
- 网络编程-I/O复用
I/O模型 Unix下可用的I/O模型有五种: 阻塞式I/O 非阻塞式I/O I/O复用(select和poll.epoll) 信号驱动式I/O(SIGIO) 异步I/O(POSIX的aio_系列函数 ...
- Cisco之show基础命令
#show version:显示版本信息等 #show running-config:显示当前(活动,并不一定保存)的配置 #show interfaces fastEthernet 0/1:进入接 ...
- eNSP启动设备AR1失败记一次解决步骤
eNSP稳定版本下载: 微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...