【美团杯2020】查查查乐乐

题目链接

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e2+5, inf = 0x3f3f3f3f;
// dp[i][l],对原串前i个字符进行修改,使得xxxll与修改后的字符串的最长公共前缀的长度为l
// dp[i][0],对原串前i个字符进行修改,使得xxxll与修改后的字符串的最长公共前缀的长度为0
// dp[i][1],对原串前i个字符进行修改,使得xxxll与修改后的字符串的最长公共前缀的长度为1
// dp[i][2],对原串前i个字符进行修改,使得xxxll与修改后的字符串的最长公共前缀的长度为2
// dp[i][3],对原串前i个字符进行修改,使得xxxll与修改后的字符串的最长公共前缀的长度为3
// dp[i][4],对原串前i个字符进行修改,使得xxxll与修改后的字符串的最长公共前缀的长度为4
int dp[maxn][5];
char s[maxn];
int main() {
    int t; scanf("%d",&t);
    while (t--) {
        memset(dp,inf,sizeof(dp));
        scanf("%s",s+1);
        int len = strlen(s+1);
        dp[0][0] = 0;
        for (int i = 1; i <= len; ++i) {
            dp[i][0] = dp[i-1][0] + (s[i] == 'x');
            dp[i][1] = min(dp[i-1][0] + (s[i] != 'x'), dp[i-1][1] + (s[i] == 'x'));  // x
            dp[i][2] = min(dp[i-1][1] + (s[i] != 'x'), dp[i-1][2] + (s[i] == 'x'));  // xx
            dp[i][3] = min(dp[i-1][2] + (s[i] != 'x'), dp[i-1][3] + (s[i] == 'l'));  // xxx
            dp[i][4] = min(dp[i-1][3] + (s[i] != 'l'), dp[i-1][4] + (s[i] == 'l'));  // xxxl
        }
        int ans = inf;
        for (int i = 0; i < 5; ++i) ans = min(ans,dp[len][i]);
        printf("%d\n",ans);
    }
    return 0;
}
posted @ 2020-05-19 22:34  麻辣猪仔  阅读(153)  评论(0编辑  收藏  举报