#zDLybttg030209. 1502:汽车加油行驶问题

1502:汽车加油行驶问题

1502:汽车加油行驶问题

题目描述

给定一个 N×NN×N 的方形网格,设其左上角为起点◎,坐标为 (1,1)(1,1)XX 轴向右为正,YY 轴向下为正,每个方格边长为 11,如图所示。

一辆汽车从起点◎出发驶向右下角终点▲,其坐标为 (N,N)(N,N)

在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:

  1. 行驶限制:汽车只能沿网格边行驶,装满油后能行驶 KK 条网格边。出发时汽车已装满油,在起点与终点处不设油库。
  2. 方向费用:汽车经过一条网格边时,若其 XX 坐标或 YY 坐标减小,则应付费用 BB,否则免付费用(即向右或向下行驶免费,向左或向上行驶需付费 BB)。
  3. 油库加油:汽车在行驶过程中遇到油库必须加满油并付加油费用 AA
  4. 增设油库:在没有油库的网格点处,汽车可以增设临时油库(加满油)并付增设油库费用 CC(不含加油费用 AA)。注意:增设油库后该点不会永久变成油库,只是本次可以使用。

N,K,A,B,CN,K,A,B,C 均为正整数,且满足约束:2N1002 \le N \le 1002K102 \le K \le 10

设计一个算法,求出汽车从起点出发到达终点的一条所付费用最少的行驶路线。

输入格式

第一行是 N,K,A,B,CN,K,A,B,C 的值。

第二行起是一个 N×NN×N00-11 方阵,每行 NN 个值,至 N+1N+1 行结束。

方阵的第 ii 行第 jj 列处的值为 11 表示在网格交叉点 (i,j)(i,j) 处设置了一个油库,为 00 时表示未设油库。各行相邻两个数以空格分隔。

输出格式

输出一个整数,表示最小费用。

样例

样例输入 #1

9 3 2 3 6
0 0 0 0 1 0 0 0 0
0 0 0 1 0 1 1 0 0
1 0 1 0 0 0 0 1 0
0 0 0 0 0 1 0 0 1
1 0 0 1 0 0 1 0 0
0 1 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0
0 1 0 0 0 0 0 0 0

样例输出 #1

12

样例解释 #1

  • 网格大小 N=9N=9,满油可行驶 K=3K=3 条边。
  • 费用参数:加油费 A=2A=2,逆向行驶费 B=3B=3,增设油库费 C=6C=6
  • 网格中 11 表示有油库,00 表示无油库。
  • 汽车从 (1,1)(1,1) 出发,必须到达 (9,9)(9,9)
  • 一种可能的最优路径(费用为 1212)需要合理规划加油点和行驶方向,可能在某些点增设油库或利用现有油库,并尽可能避免逆向行驶费用。

数据范围

  • 2N1002 \le N \le 100
  • 2K102 \le K \le 10
  • A,B,CA, B, C 为正整数,具体范围未给出,但应在合理范围内

时空限制

  • 时间限制:1000 ms
  • 内存限制:262144 KB

注意:本题可以使用分层图最短路(状态为 (x,y,剩余油量)(x, y, 剩余油量))或动态规划求解。由于 K10K \le 10,状态数可控。