变相

最优解法

可以发现,每一列能拿到的最多金币数取决于他上一列拿了多少金币。考虑动态规划
代表位于第i列第j行最多可以赚多少金币,那么对于它可以被更新(如果对应的格子在跑道内)。
时间复杂度
因为需要开dp辅助数组。空间复杂度

int dp[100005][3];
int solve(int n, vector<int> &a1, vector<int> &a2, vector<int> &a3, vector<int> &m){
    dp[0][0] = a1[0];dp[0][1] = a2[0];dp[0][2] = a3[0];
    for(int i = 1; i < n; ++i){
        dp[i][0] = a1[i] + max(dp[i-1][0], dp[i-1][1]-m[i-1]);
        dp[i][1] = a2[i] +  max(max(dp[i-1][1], dp[i-1][0]-m[i-1]), dp[i-1][2]-m[i-1]);
        dp[i][2] = a3[i] + max(dp[i-1][2], dp[i-1][1]-m[i-1]);
    }
    int ans = max(dp[n-1][0], dp[n-1][1]);
    ans = max(ans, dp[n-1][2]);
    return ans;
}
全部评论

相关推荐

狠赚笔第一人:学计算机自己不努力怪大环境?我大一就拿到了美团大厂的offer,好好看看自己有没有努力查看图片
点赞 评论 收藏
分享
我见java多妩媚:大外包
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务