SDU-考试模测 T3

  • Post author:
  • Post category:其他


题目

青蛙去找瓜瓜,青蛙在1号位置,瓜瓜在n号位置。

青蛙一次可以走 k 步,走1 ~ k 步耗费的体力不同。

问青蛙找到瓜瓜耗费的最小体力是多少?


输入

第一行输入n、k、op,op = 1时,需要计算耗费最小体力的路径一共有多少条;

第二行输入k个数,分别是走 1 ~ k 步耗费的体力 a[ i ]。


输出

如果op = 0,输出1个数,为最小体力;如果op = 1,输出最小体力后,输出路径数。


数据范围

n最大到了1e9,好像

思路

如果想偷点分,不会op = 1的情况,就先别管它了!

数据范围太大,处理不了,也别管它了!


然后经过一顿骚操作,变成了一个简单的dp问题:

f [ i ] 为走到第 i 号位置,需要耗费的最小体力。


f[ i ] = min( a[ j ] + f [ i – j ] ),1 <= j <= k。


然后解决数据范围大的问题:

我们刚才 f 数组的大小是n,但我们可以发现,其实状态转移的时候只需要 f[ i – k ] ~ f  [i – 1 ],其实我考虑可以用队列实现这个数组?

然后解决 op = 1 的问题,在每次求 f 的时候,在循环里找到

min( a[ j ] + f [ i – j ] ),

然后统计minn的个数,每一个乘 f [ i – j ]的num,最后求和就是f [ i ]的num。


PS:虽然我嘴炮了这么多,其实我考试的时候只写了个暴力dp,拿了40分,后头的都是review的时候想的,没实现23333



版权声明:本文为weixin_44876049原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。