信奥赛CSP-J复赛集训(DP专题)(19):P3399 丝绸之路
题目背景
张骞于公元前 138 年曾历尽艰险出使过西域。加强了汉朝与西域各国的友好往来。从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚、西亚和欧洲,将那里的香料、良马传进了我国。每当人们凝望荒凉的大漠孤烟,无不引起对往日商贸、文化繁荣的遐想……
题目描述
小仓鼠带着货物,从中国送到安息,丝绸之路包括起点和终点一共有 N + 1 N+1 N+1 个城市, 0 0 0 号城市是起点长安, N N N 号城市是终点巴格达。要求不超过 M M M 天内必须到达终点。一天的时间可以从一个城市到连续的下一个城市。从 i − 1 i-1 i−1 城市到 i i i 城市距离是 D i D_i Di。
大家都知道,连续赶路是很辛苦的,所以小仓鼠可以在一个城市时,可以有以下选择:
-
移动:向下一个城市进发
-
休息:呆在原来的城市不动
沙漠天气变化无常,在天气很不好时,前进会遇到很多困难。我们把 M M M 天的第 j ( 1 < = j < = M ) j(1<=j<=M) j(1<=j<=M) 天的气候恶劣值记为 C j C_j Cj。从 i − 1 i-1 i−1 城市移动到 i i i 城市在第 j j j 天进发时,需要耗费 D i × C j D_i\times C_j Di×Cj 的疲劳度。
不过小仓鼠还是有选择权的,可以避开比较恶劣的天气,休息是不会消耗疲劳值的。现在他想知道整个行程最少要消耗多少疲劳值。
输入格式
第一行 2 2 2 个整数 N N N, M M M。
接下来,连续 N N N 行每行一个整数 D j D_j Dj。
连续 M M M 行每行一个整数 C j C_j Cj。
输出格式
一个整数,表示最小疲劳度。
输入输出样例 #1
输入 #1
3 5
10
25
15
50
30
15
40
30
输出 #1
1125
说明/提示
样例解释
第 1 1 1 天休息。
第 2 2 2 天 0 → 1 0\rightarrow 1 0→1 疲劳值 10 × 30 = 300 10 × 30 = 300 10×30=300。
第 3 3 3 天 1 → 2 1\rightarrow2 1→2 疲劳值 25 × 15 = 375 25 × 15 = 375 25×15=375。
第 4 4 4 天休息。
第 5 5 5 天 2 → 3 2\rightarrow3 2→3 疲劳值 15 × 30 = 450 15 × 30 = 450 15×30=450。
数据范围
1 ≦ N ≦ M ≦ 1000 1 ≦ N ≦ M ≦ 1000 1≦N≦M≦1000。
1 ≦ D i , C i ≦ 1000 1 ≦ D_i , C_i ≦ 1000 1≦Di,Ci≦1000。
AC代码:
#include<bits/stdc++.h>
using namespace std;
/*思路: 1、dp数组:dp[i][j]含义:前j天走到第i个城市的代价情况一: 第j天在第i个城市休息 dp[i][j]=dp[i][j-1]情况二: 第j天从第i-1个城市到第i个城市dp[i][j]=dp[i-1][j-1]+d[i]*c[j]2、状态转移方程:dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+d[i]*c[j])*/
int n,m,d[1010],c[1010],dp[1010][1010];
int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>d[i];for(int i=1;i<=m;i++) cin>>c[i];//dp初始化memset(dp,0x3f,sizeof(dp));for(int j=0;j<=m;j++) dp[0][j]=0;//用j天走到第0个城市的代价均为0 //递推for(int i=1;i<=n;i++){//城市 for(int j=1;j<=m;j++){//天数 dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+d[i]*c[j]);}} //输出cout<<dp[n][m]; return 0;
}
文末彩蛋:
关注并查看老师的个人主页,学习完整csp信奥赛完整系列课程: https://edu.csdn.net/lecturer/7901