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

题意:

  给你一个仅包含大写字母和小写字母的字符串,你可以将让小写字母转化为大写字母,大写字母转化为小写字母,求最好的操作步数使得最后的字符串左边全是大写字母,右边全是小写字母.

思路:

有点像是树状DP,把每个字母看成一个节点,后一个字母为前一个字母的父节点.给予每个节点两种状态:

  状态一(dplow[i]) : 当字符串长度为 i 时,第 i 个字母为小写(转化后),得到符合条件的字符串的最少操作步数.

  状态二(dpsup[i]) : 当字符串长度为 i 时,第 i 个字母为大写(转化后),得到符合条件的字符串的最少操作步数.

那么最后的答案取最后一个字母的两个状态中值小的那么就好了, 接下来分析下状态转移方程:

  如果第 i 个字母为小写:

    对于其状态一 : 不需要转化,当前节点本身为小写.因为当前状态可以由其子节点的状态一和状态二转移而来,所以只要取其中比较小的就好了,DP转移方程:

      dplow[i] = min ( dplow[i - 1], dpsup[ i - 1]);

    对于其状态二 : 转化完成后,当前节点为大写,那么当前状态只能由其子节点的状态二转移而来.所以当前的值为其子节点状态二的值加 1,DP转移方程为:

      dpsup[i] = dpsup[ i - 1] + 1;

  如果第 i 个字母为大写:

    对于其状态一 : 转化为小写之后, 当前的状态可以由其子节点的状态一和状态二转移而来,所以当前值为其子节点两个状态值比较小的那个加 1,DP转移方程为:

      dplow[i] = min ( dplow[i - 1], dpsup[ i - 1]) + 1;

    对于其状态二 : 不需要转化,当前状态只能由其子节点的状态二转移而来.所以当前值就是其子节点状态二的值,DP转移方程为:

      dpsup[i] = dpsup[i - 1];

至此,状态转移就分析完成了.实现上,由于父节点只和其子节点的状态有关,所以用两个变量就好了.

代码:

 #include <bits/stdc++.h>

 using namespace std;
const int MAXN = ;
char s[MAXN + ]; void DFS(int k, int &tolow, int &tosup) {
if(k == ) { isupper(s[k]) ? tolow = : tosup = ; return ; }
DFS(k - , tolow, tosup); tolow = min(tolow, tosup);
isupper(s[k]) ? tolow++ : tosup ++;
} int main() {
ios_base::sync_with_stdio(); cin.tie(); cin >> s;
int len = strlen(s), low = , sup = ;
DFS(len - , low, sup);
cout << min(low, sup) << endl;
return ;
}

最新文章

  1. hibernate5.2需要的最少jar文件
  2. PHP安装kafka插件
  3. REST架构之Apache Wink
  4. wordpress后台404页面
  5. HYSBZ 1588 营业额统计
  6. ACMer(转)
  7. TexturePacker的使用
  8. 获取本地IP和端口号的指令
  9. github配置和git学习
  10. 配置Sublime Text 2 的Python运行环境
  11. Mysql Innodb体系结构
  12. mongo安装,及远程连接
  13. Luogu P1747 好奇怪的游戏
  14. GDAL C#中文路径,中文属性名称乱码问题
  15. syncer.go
  16. Kafka相关内容总结(概念和原理)
  17. 设计模式学习之享元模式(Flyweight,结构型模式)(20)
  18. 【搬运工】 Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39;
  19. AspectJ在Spring中的使用
  20. Scrapy中将item字段转为简体or繁体

热门文章

  1. [bzoj1056] [HAOI2008]排名系统
  2. 如何使用Photoshop制作真实的尺子
  3. Asp.Net Core 基于QuartzNet任务管理系统(这是一篇用来水的随笔)
  4. HDU2057
  5. windows下mysql 5.7的配置全过程
  6. [bzoj3223]文艺平衡树——splay
  7. bzoj 2659 几何
  8. 在ubuntu 上面安装ubuntu touch 模拟器
  9. PHP代码中input控件使用id无法POST传值,使用name就可以
  10. KVM基本概念