HDU 2557 How to type
2016-03-09 14:20
429 查看
Problem Description
Pirates have finished developing the typing software. He called Cathy to test his typing software. She is good at thinking. After testing for several days, she finds that if she types a string by some ways, she will type the key at least. But she has a badhabit that if the caps lock is on, she must turn off it, after she finishes typing. Now she wants to know the smallest times of typing the key to finish typing a string.
Input
The first line is an integer t (t<=100), which is the number of test case in the input file. For each test case, there is only one string which consists of lowercase letter and upper case letter. The length of the string is at most 100.
Output
For each test case, you must output the smallest times of typing the key to finish typing this string.
Sample Input
3 Pirates HDUacm HDUACM
Sample Output
8 8 8 <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div> The string “Pirates”, can type this way, Shift, p, i, r, a, t, e, s, the answer is 8. The string “HDUacm”, can type this way, Caps lock, h, d, u, Caps lock, a, c, m, the answer is 8 The string "HDUACM", can type this way Caps lock h, d, u, a, c, m, Caps lock, the answer is 8</div>
动态规划类型题目。由于打第i个字母时,不确定Caps Look是on 还是 of,从而定义DP_Open[i]和DP_Close[i]表示第打第i个字母时分别为 on状态和off状态。于是状态转移方程为:
如果第i+1个字母是大写:
DP_Open[i + 1] = min(DP_Open[i] + 1, DP_Close[i] + 2);
DP_Close[i + 1] = min(DP_Close[i] + 2, DP_Open[i] + 2);
如果第i+1个字母是小写:
DP_Open[i + 1] = min(DP_Open[i] + 2, DP_Close[i] + 2);
DP_Close[i + 1] = min(DP_Close[i] +1, DP_Open[i] + 2);
初始化时DP_Open[0]=1,这是由于最开始状态是off,要打第0个字母时为Open就需要敲一次该键
DP_Close[0]=0; 一开始状态就是关着的。
#include<iostream>
#include<string>
using namespace std;
#define MAX 102
bool Type(char ch){
if (ch >= 'A'&&ch <= 'Z')
return 1;
else
return 0;
}
int min(const int&a, const int&b){
return a < b ? a : b;
}
int DP_Open[MAX];
int DP_Close[MAX];
int main(){
string s;
int i,T,length,minTimes;
cin >> T;
DP_Close[0]= 0;
DP_Open[0] = 1;
while (T--){
cin >> s;
length = s.size();
for (i = 0; i < length; i++){
if (Type(s[i])){
DP_Open[i + 1] = min(DP_Open[i] + 1, DP_Close[i] + 2);
DP_Close[i + 1] = min(DP_Close[i] + 2, DP_Open[i] + 2);
}
else{
DP_Open[i + 1] = min(DP_Open[i] + 2, DP_Close[i] + 2);
DP_Close[i + 1] = min(DP_Close[i] +1, DP_Open[i] + 2);
}
}
minTimes = min(DP_Close[length], DP_Open[length] + 1);
cout << minTimes << endl;
}
return 0;
}
相关文章推荐
- 1062. Talent and Virtue (25) 排序
- C#开发COM组件
- php 科学计数法转化正常数值输出 解决方案
- php利用smtp类轻松的发送电子邮件
- 详解设计模式中的模板方法模式及在C++中的使用
- centos6.5挂载ntfs
- WARN Fetching topic metadata with correlation id 955 for topics [Set(test3)] from broker [BrokerEndP
- 修复office 2007或2010安装程序找不到Proplas.ww/Proplsww.cab
- 剑指offer-栈的压入、弹出序列(标志:++)
- 数据结构之“Ordered List and Sorted List”(七)
- discuz X3.2 DB:类数据库操作
- 【转】Xcode真机测试could not find developer disk image解决方法
- html 通用 遮罩弹出层 弹出后 支持跳转页面
- lua_VC6环境
- 构建高效安全的Nginx Web服务器
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- android开发常见编程错误总结
- SVN服务器搭建和使用和Mac下提交本地项目到git
- block使用技巧
- 运算符优先级与结合性