题目链接: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$。