Problem
有一只青蛙在x轴上跳,起初在原点,现有N种跳跃技能可以购买,每技能有两属性:跳跃长度Li 以及 花费Ci。若购买了第 i 种技能,则可以从 y 位置跳跃到 y+Li 或者 y-Li 位置,但需花费Ci 元。求最小花费使得青蛙可以跳到每一个整数点上,若无法做到,输出-1。
Limits
Time Limit(ms): 2000
Memory Limit(MB): 256
N: 300
Li: [1, 10^9]
Ci: [1, 10^5]
Solution
若购买了n个属性使得青蛙可以跳到每个整数点上,则这n个属性的跳跃长度Li的最大公约数一定为1,或者说n个数互素。用dp方法即可解决,需在map上dp。
More
设dp[i]表示 最大公约数为 i 时的最小花费为dp[i]。则转移方程自然为:dp[gcd(i, L)]=min(dp[gcd(i, L)],dp[i]+C);但需在map上dp,最好再额外开个map来做临时存储。
由于gcd的性质,可以证明状态数很小,不会超时。
Complexity
Time Complexity: Very Small
Memory Complexity: Very Small
Source
Code
Codeforces Round #290 Div1 B From My Github
时间: 2024-10-16 18:28:24