• Codeforces 180C


    题目链接:http://codeforces.com/problemset/problem/180/C

    题意:

    有一段字符串,包含大小写字母,每次可以将其中一个字母由大写变成小写,或者小写变成大写。要求这个字符串最终变成任意大写字母都在任意小写字母的前面的情况。问最少变换多少个字母可达到要求。

    题解:

    $f[i][0,1]$ 表示前 $i$ 个字母,第 $i$ 个字母为 $0$大写 / $1$小写,最少要改变的字母数。

    AC代码:

    #include<bits/stdc++.h>
    #define L(x) ('a'<=x && x<='z')
    using namespace std;
    const int maxn=1e5+5;
    string s;
    int f[maxn][2]; //0大写 1小写
    int main()
    {
        cin>>s;
        f[0][0]=L(s[0]), f[0][1]=!L(s[0]);
        for(int i=1;i<s.size();i++)
        {
            f[i][0]=f[i-1][0]+L(s[i]);
            f[i][1]=min(f[i-1][0],f[i-1][1])+!L(s[i]);
        }
        cout<<min(f[s.size()-1][0],f[s.size()-1][1])<<endl;
    }

    PS.这里有一个需要注意的是,不要直接用isupper和islower函数,这两个函数返回非零值不一定是 $1$。

  • 相关阅读:
    命令别名与历史命令
    Shell的变量功能
    Shell的变量功能
    认识BASH这个Shell
    vim程序编辑器
    其他vim使用注意事项
    vim的额外功能
    六、集合
    五、字典
    四、列表 元组
  • 原文地址:https://www.cnblogs.com/dilthey/p/10459966.html
Copyright © 2020-2023  润新知