变相

最优解法

可以发现,每一列能拿到的最多金币数取决于他上一列拿了多少金币。考虑动态规划
代表位于第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;
}
全部评论

相关推荐

03-27 17:33
门头沟学院 Java
代码飞升:同学院本,你要注意hr当天有没有回复过,早上投,还要打招呼要推销自己,不要一个劲投
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务