作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一道面试题
There is a series of days
D1, D2,...Dn
that you can choose to work. Each workingi
-th day you are paid with a salarySi
. If you work in dayDi
, then you could not work for the followingNi
days right after. Maximize your salary using DP.
下面是我想出的解决方案:
让 OPT (i) 表示第 Di 天的最高工资。我是否在第 i 天工作有两种可能性。我的递归公式:OPT (i) = max (OPT(i-Ni)+Si, OPT(i-1)
Maximize_salary(n)
Initialize my array M[i] = 0 for i <= 0
for i = 1 to n
M[i] = max(M[i-Ni]+Si, M[i-1])
end for
return M[n]
我的方法正确吗?我担心 for 循环间隔,因为我使用的是 i-Ni。我是否需要将数组 M 中的所有值初始化为 Ni?
我认为我的算法的复杂度是 O(n)。
最佳答案
您的方法是正确的,尽管您可以简单地检查您尝试访问的 M[k]
是否存在,如果不存在则返回 0。此外,如果今天是 d
日,并且您已经 r
天没有工作,那么您可以工作的最后一天是 d - r - 1
。
def maximizeSalary(M, N, S, n):
def getM(index):
if index < 0: return 0 else: return M[index]
for i = 0 to n - 1:
M[i] = max(getM(i - N[i] - 1) + S[i], getM(i - 1))
关于algorithm - 如何使用动态规划最大化单位(即本例中的薪水)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24223952/
假设我有一个 employee 表,其中有一列 salary。我想在年底时给薪水 > 4000 美元的人加薪 10%,给薪水 4000 THEN 1.1 ELSE 1.05 END 或特定函数如:I
我是一名优秀的程序员,十分优秀!