首页 > 其他 > 详细

b_lc_最少侧跳次数(向前看dp)

时间:2021-04-11 15:46:25      阅读:17      评论:0      收藏:0      [点我收藏+]

给定一个长为n的数组A(n<5*10^5),A[i] (取值范围从 0 到 3)表示在点 i 处的 A[i] 跑道上有一个障碍。如果 A[i] == 0 ,那么点 i 处没有障碍。任何一个点的三条跑道中 最多有一个 障碍。求这只青蛙从点 0 处跑道 2 出发,并想到达点 n 处的 任一跑道 ,请你返回 最少侧跳次数
技术分享图片

const int N = 5e5+5, inf = 0x3f3f3f3f;
class Solution {
public:
    int f[N][4];
    int minSideJumps(vector<int>& A) {
        int n = A.size();
        memset(f, inf, sizeof f);
        f[1][1] = f[1][3] = 1, f[1][2] = 0;

        for (int i=2; i<=n; i++) {
            int id = A[i-1];
            for (int j=1; j<=3; j++) {
                if (id == j) continue; //j这个位置不能走
                for (int k=1; k<=3; k++) {
                    if (k == id) continue; //k这个位置不能走
                    if (k == j) f[i][j] = min(f[i][j], f[i-1][k]);
                    else f[i][j] = min(f[i][j], f[i-1][k]+1);
                }
            }
        }
        return min({f[n][1], f[n][2], f[n][3]});
    }
};

b_lc_最少侧跳次数(向前看dp)

原文:https://www.cnblogs.com/wdt1/p/14643427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!