codeforces 180C
题意:
给
定
一
串
字
符
,
只
含
小
写
和
大
写
字
母
,
你
可
以
将
任
意
字
符
随
意
转
换
大
小
写
。
给定一串字符,只含小写和大写字母,你可以将任意字符随意转换大小写。
给定一串字符,只含小写和大写字母,你可以将任意字符随意转换大小写。
问
最
少
操
作
数
,
使
字
符
串
左
边
全
是
大
写
字
母
,
右
边
全
是
小
写
字
母
。
问最少操作数,使字符串左边全是大写字母,右边全是小写字母。
问最少操作数,使字符串左边全是大写字母,右边全是小写字母。
题解:
d p [ i ] [ j ] 表 示 在 区 间 [ 1 , i ] 上 , 当 前 字 母 变 成 小 写 ( j = 0 ) 或 大 写 ( j = 1 ) 时 的 最 少 操 作 数 。 dp[i][j]表示在区间[1,i]上,当前字母变成小写(j=0)或大写(j=1)时的最少操作数。 dp[i][j]表示在区间[1,i]上,当前字母变成小写(j=0)或大写(j=1)时的最少操作数。
- 若 当 前 字 母 是 小 写 , d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] ) , d p [ i ] [ 1 ] = d p [ i − 1 ] [ 1 ] + 1 若当前字母是小写,dp[i][0] = min(dp[i-1][0], dp[i-1][1]),dp[i][1] = dp[i-1][1]+1 若当前字母是小写,dp[i][0]=min(dp[i−1][0],dp[i−1][1]),dp[i][1]=dp[i−1][1]+1
- 若 当 前 字 母 是 大 写 , d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] ) + 1 , d p [ i ] [ 1 ] = d p [ i − 1 ] [ 1 ] 若当前字母是大写,dp[i][0] = min(dp[i-1][0], dp[i-1][1])+1,dp[i][1] = dp[i-1][1] 若当前字母是大写,dp[i][0]=min(dp[i−1][0],dp[i−1][1])+1,dp[i][1]=dp[i−1][1]
#include <bits\stdc++.h>
using namespace std;
const int N = 100001;
int dp[N][2];
int main() {
string s;
cin >> s;
int n = s.size();
for(int i = 0 ; i < n ; i++){
dp[i][0] = islower(s[i]) ? min(dp[i-1][0], dp[i-1][1]) : min(dp[i-1][0], dp[i-1][1])+1;
dp[i][1] = islower(s[i]) ? dp[i-1][1]+1 : dp[i-1][1];
}
cout << min(dp[n-1][0], dp[n-1][1]) << endl;
return 0;
}