DP-动态规划-排队买票

题目 :

一场演唱会即将举行,现有n个歌迷排队买票,一人面一张票,而售票处规定,一人每次只能买一张票,假设第i位歌迷买一张票需要时间T[i](1<=i<=n),队伍中相邻的两位歌迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一个人就可以不用排队了,则这两位歌迷买两张票的时间变为R[j],且有R[j]<T[j]+T[j+1],这样做就可以缩短后面歌迷的等待时间,加快整个售票的进程。现在给出 n ,T[j]和R[j],求使每个人都买到票的最短时间和算法。

题目解析:

首先题目有歧义:

队伍中相邻的两位歌迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一个人就可以不用排队了

这样理解的话: 第i个人可以给 第 i+1 买 也可以给 i-1 买

则这两位歌迷买两张票的时间变为R[j],且有R[j]<T[j]+T[j+1]

这样理解的话:第 i 个人只能给 第i+1 个人买

两种的理解的有两种的解题的方式,先说简单的   第二种理解方式:

从最后一个人考虑 要么自己买,要么让前一个人代买:

设 f(i)表示 前i个 买票的最短时间,则

f(i) = min{f(i-1)+T[i],f(i-2)+R[i-1]}  (i = 2 ~ n)

较难理解的是第二种:第 i 个人可以给第 i-1 个人买,也可以给第 i+1 个买

从最后一个考虑:有5种情况,1,单独买,2:给前一个人买,3:给后一个人买,4:让前一个人买,5:让后一个人买

则:状态转移方程分5种情况:
F(I,仅买1张)=MIN{F(I-1,仅买1张),F(I-1,买2张代前一位),F(I-1,不买由前代)}+Ti
F(I,买2张代前一位)=MIN{F(I-2,仅买1张),F(I-2,买2张代前一位),F(I-2,不买由前代)}+Ri
F(I,买2张代后一位)=MIN{F(I-1,仅买1张),F(I-1,买2张代前一位),F(I-1,不买由前代)}+Ri
F(I,不买由前代)= F(I-1,买2张代后一位)
F(I,不买由后代)=MIN{ F(I-1,仅买1张),F(I-1,买2张代前一位),F(I-1,不买由前代)}
原文地址:https://www.cnblogs.com/rainboy/p/3707044.html