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

题目链接

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

思路: D P DP DP ,对于老虎机,由于是翻倍,期望值则是 a n s [ i ] ∗ 2 ∗ Q [ i ] ans[i] * 2 * Q[i] ans[i]2Q[i] ( a n s [ i ] ans[i] ans[i] 为当天手头上的资金, Q [ 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 ans[i](100+M[j])(100P[j])//10000(产生的期望值为第 i + D [ j ] i + D[j] i+D[j] 天的)。由于要取最值且模数是 1000000007 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值