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];
}
};