题意理解
约翰要用木筏把 NNN 头奶牛运过河。运 kkk 头牛单程需要 M+M1+M2+⋯+MkM + M_1 + M_2 + \cdots + M_kM+M1 +M2 +⋯+Mk 分钟。每批运完后(除最后一批外)约翰要空船返回,返回需要 MMM 分钟。求最少总时间。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
使用动态规划。
先预处理 cost[k]cost[k]cost[k] 表示一次运 kkk 头牛过河的单程时间:
cost[k]=M+M1+M2+⋯+Mkcost[k] = M + M_1 + M_2 + \cdots + M_k cost[k]=M+M1 +M2 +⋯+Mk
设 dp[i]dp[i]dp[i] 表示:运完前 iii 头牛并返回原岸的最小时间。
状态转移:
枚举这一批运多少头牛:
dp[i]=minj=0i−1(dp[j]+cost[i−j]+M)dp[i] = min_{j=0}^{i-1}(dp[j] + cost[i-j] + M) dp[i]=minj=0i−1 (dp[j]+cost[i−j]+M)
边界条件:
* dp[0]=0dp[0] = 0dp[0]=0:没有牛需要运送
答案: dp[N]−Mdp[N] - Mdp[N]−M(最后一批不需要返回)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码