牛客寒假算法基础集训营3 - H 处女座的百日理财计划 大数+dp

题目链接

题意:初始资金是1000,一共100天,每天早上可以收回到期的投资资金,中午可以玩老虎机有概率翻倍手头的资金,晚上可以选择借给别人钱,问第100天结束之后能获得的钱的最大期望值。

思路: D P DP ,对于老虎机,由于是翻倍,期望值则是 a n s [ i ] 2 Q [ i ] ans[i] * 2 * Q[i] ( a n s [ i ] ans[i] 为当天手头上的资金, Q [ i ] Q[i] 为当天老虎机翻倍的概率),对于晚上借钱,因为如果有最优的方案肯定是把所有钱都投进去所获得期望最大,所以枚举方案的时候就是把所有钱借出去给同一个人,借钱产生的期望则是 a n s [ i ] ( 100 + M [ j ] ) ( 100 P [ j ] ) / / 10000 ans[i] * (100 + M[j]) * (100 - P[j]) // 10000 (产生的期望值为第 i + D [ j ] i + D[j] 天的)。由于要取最值且模数是 1000000007 1000000007 ,所以中途必须得用大数,最后结果取模。

#-*-coding:utf-8 -*-
n = int(input())
D = [0] * 10005
M = D[:]
P = M[:]
ans = [0] * 105
for i in range(n):
    D[i] ,M[i] ,P[i] = map(int , input().split(" "))
Q = [int(i) for i in input().split(" ")]
ans[0] = 1000
for i in range(100):
    if i > 0:
        ans[i] = max(ans[i - 1] , ans[i])#早上回收借给别人到期的资金
    if Q[i] > 50:
        ans[i] = ans[i] * 2 * Q[i] // 100#中午老虎机
    for j in range(n):
        if i + D[j] <= 100:
            ans[i + D[j]] = max(ans[i + D[j]] , ans[i] * (100 + M[j]) * (100 - P[j]) // 10000)#晚上考虑借钱
print(ans[99] % 1000000007)

猜你喜欢

转载自blog.csdn.net/a302549450/article/details/86677639