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

时间:2021-04-12 12:36:30   收藏: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]});
    }
};
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!