首页 > 试题广场 >

变向

[编程题]变向
  • 热度指数:1788 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛牛准备在一个3行n列的跑道上跑步。一开始牛牛可以自己选择位于(1,1)还是(2,1)还是(3,1)。

跑道的每一格都有一些金币,当牛牛跑到一个格子,他会获得这个格子的所有金币。

当牛牛位于第i行第j列时,他可以的下一步最多可能有三种选择:

1. 不花费金币跑到第i行第j+1列
2. 花费m_j的金币跑到第i-1行第j+1列(如果i=1则不可以这么跑)。
3. 花费m_j的金币跑到第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金币。

备注:
第1个参数n代表跑道的列数
第2,3,4个参数vector<int> a1,a2,a3各有n个元素,代表第1,2,3行每一列的金币个数
第5个参数vector<int> m有n个元素代表每一列进行换行的时候需要的金币花费
动态规划python总是运行超时,想问一问有没有复杂度更小的方法啊
class Solution:
    def solve(self , n , a1 , a2 , a3 , m ):
        # write code here
        dp = [[0 for i in range(3)] for j in range(n)]
        dp[0][0]=a1[0]
        dp[0][1]=a2[0]
        dp[0][2]=a3[0]
        for i in range(1,n):
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]- m[i - 1])+a1[i]
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - m[i - 1])+a3[i]
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - m[i-1], dp[i - 1][2] - m[i - 1]) +a2[i]
        return max(dp[n - 1][0], dp[n - 1][1], dp[n - 1][2])
发表于 2020-06-09 20:01:33 回复(2)