LCP 19. 秋叶收藏集【动态规划】

LCP 19. 秋叶收藏集(线性DP)

启示:当一个状态不够表示的时候,可以多想几个阶段状态来辅助递推。

class Solution {
    
    
public:
    int minimumOperations(string s) {
    
    
        int n = s.size();
        /*
        // f[i][0] : 到前i个字符都是红的最小操作次数
            转移:f[i][0] = f[i-1][0] + (s[i] == 'r' ? 0 : 1)
        // f[i][1] : 到前i个字符符合红黄的最小操作次数
            转移:f[i][1] = f[i-1][0] + (s[i] == 'y' ? 0 : 1)
                          = f[i - 1][1] + (s[i] == 'y' ? 0 : 1)
        // f[i][2] : 到前i个字符符合红黄红的最小操作次数
            转移 f[i][2]  = f[i-1][1] + (s[i] == 'r' ? 0 : 1)
                          = f[i-1][2] + (s[i] == 'r' ? 0 : 1);
        */
        vector<vector<int>> f(n,vector<int>(3));
        f[0][0] = (s[0] == 'r' ? 0 : 1);
        for(int i = 1; i < n; i ++ )
        {
    
    
            f[i][0] = f[i-1][0] + (s[i] == 'r' ? 0 : 1);
            f[i][1] = f[i-1][0] + (s[i] == 'y' ? 0 : 1);
            if(i > 1)
            {
    
    
                f[i][1] = min(f[i][1], f[i-1][1] + (s[i] == 'y' ? 0 : 1));
                f[i][2] = f[i-1][1] + (s[i] == 'r' ? 0 : 1);
            }
            if(i > 2)
            {
    
    
                f[i][2] = min(f[i][2],f[i-1][2] + (s[i] == 'r' ? 0 : 1));
            }
        }

        return f[n - 1][2];
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43154149/article/details/108581666