变向

题目描述
牛牛准备在一个3行n列的跑道上跑步。一开始牛牛可以自己选择位于(1,1)还是(2,1)还是(3,1)。
跑道的每一格都有一些金币,当牛牛跑到一个格子,他会获得这个格子的所有金币。
当牛牛位于第i行第j列时,他可以的下一步最多可能有三种选择:

  1. 不花费金币跑到第i行第j+1列
  2. 花费mj的金币跑到第i-1行第j+1列(如果i=1则不可以这么跑)。
  3. 花费mj的金币跑到第i+1行第j+1列(如果i=3则不可以这么跑)。
    (牛牛是一个富豪,本身带了很多的金币,所以你不用担心他钱不够用)
    现在告诉你所有格子的金币数量和每一列的金币花费,牛牛想知道他跑到第n列最多可以赚得多少金币(赚得金币=获得金币-消耗金币)

示例1
输入
复制
3,[1,9,3],[6,4,6],[1,1,5],[3,2,1]
输出
复制
16
说明
一开始牛牛选择位于第2行第1列,拿到6个金币。然后牛牛花3金币到第1行的2列拿到9个金币,最后牛牛花费2金币到第2行第3列。总共获得21金币,消耗5金币。赚得16金币。

int solve(int n, vector<int>& a1, vector<int>& a2, vector<int>& a3, vector<int>& m) {
        // 由题目知可以任意从(1,1)(2,1)(3,1)开始
        //则可以知道假设第二次跳到(1,2)时只可能从(1,1)或者(2,1)跳
        //则有跑到(1,2)的总金币为max((1,1),(2,1)-m1)
        //由此类推其他也是如此
        for(int i=1;i<n;i++)
        {
            a1[i]+=max(a1[i-1],a2[i-1]-m[i-1]);
            a3[i]+=max(a3[i-1],a2[i-1]-m[i-1]);
            a2[i]+=max(a2[i-1],max(a1[i-1]-m[i-1],a3[i-1]-m[i-1]));
        }
        return max(a1[n-1],max(a2[n-1],a3[n-1]));
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值