题目链接:

题目大意:
给你一个仅仅包括大写和小写字母的字符串,如今Pirates要从键盘上输出它。按CapsLk可开

启关闭大写和小写指示灯。

按Shift可转换将输入字母的大写和小写而不改变CapsLk的开关状态。Pirates有

一个坏习惯,假设输入的时候CapsLk是开着的,那么输入结束后必须把它关闭。

问,输入一个字符

串,最小的按键数目是多少

思路:

用两个数组dpa和dpb分别来表示CapsLk关闭状态和开启状态的最小操作数。

假设将要输入的字母是小写字母:

dpa[i+1] = min(dpa[i]+1,dpb[i]+2);  不开灯的情况下直接按字母,开灯情况则先关灯再按字母

dpb[i+1] = min(dpa[i]+2,dpb[i]+2);  不开灯的情况下按字母再开灯。开灯情况下Shift+按字母,

最后保持开灯状态

假设将要输入的字母是大写字母:

dpa[i+1] = min(dpa[i]+2,dpb[i]+2);  不开灯的情况下按Shift+字母,开灯情况下则按字母再关灯

dpb[i+1] = min(dpa[i]+2,dpb[i]+1);  不开灯的情况下开灯按字母。开灯情况下直接按字母

最后dpb[len]++,要把灯关掉。

初始化为dpa[0] = 0。dpb[0] = 1,由于dpb状态刚開始要开灯。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; int dpa[110],dpb[110];
char a[110]; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
getchar();
scanf("%s",a);
memset(dpa,0,sizeof(dpa));
memset(dpb,0,sizeof(dpb));
dpa[0] = 0;//dpa为关灯状态最小操作数
dpb[0] = 1;//dpb为开灯状态最小操作数
int len = strlen(a);
for(int i = 0; i < len; i++)
{
if(a[i]>='a' && a[i]<='z')
{
dpa[i+1] = min(dpa[i]+1,dpb[i]+2);
dpb[i+1] = min(dpa[i]+2,dpb[i]+2);
}
else
{
dpa[i+1] = min(dpa[i]+2,dpb[i]+2);
dpb[i+1] = min(dpa[i]+2,dpb[i]+1);
}
}
dpb[len]++;
int ans = min(dpa[len],dpb[len]);
printf("%d\n",ans);
}
return 0;
}

HDU2577 How to Type【DP】的更多相关文章

  1. HDU 2577 How to Type【DP】

    题意:给出一个字符串,有大写有小写,问最少的按键次数.然后打字的这个人有一个习惯,打完所有的字之后,指示灯要关闭. dp[i][j]表示打到第i个字母,j有0,1两个值表示指示灯开或者关的状态 然后就 ...

  2. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  3. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  4. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  5. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  6. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  7. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  8. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  9. HackerRank - common-child【DP】

    HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...

随机推荐

  1. Swift Intermediate Language (SIL)

    Swift Intermediate Language (SIL) https://github.com/apple/swift/blob/master/docs/SIL.rst#witness-me ...

  2. jQuery 全选、全不选、反选

    <!DOCTYPE html> <html lang="en"> <head> <title></title> < ...

  3. comm - 逐行比较两个已排序的文件

    总览 (SYNOPSIS) ../src/comm [OPTION]... LEFT_FILE RIGHT_FILE 描述 (DESCRIPTION) 逐行比较 已排序的 文件 LEFT_FILE 和 ...

  4. hdfs深入:04、hdfs当中的元数据管理以及元数据节的查看

    6.HDFS的元数据信息FSimage以及edits和secondaryNN的作用 fsimage:存放的是一份最完整的元数据信息,内容比较大edits:元数据操作日志,记录了一段时间的元数据信息的变 ...

  5. vue slot的使用介绍

    插槽:slot (不知道我这样理解是不是对的,欢迎大佬指点) 具体是什么样子的,请看例子说明 父组件代码 子组件代码 结果 可以看到 ,结果是父组件里面内容显示了,子组件内容显示了,但是在父组件中插入 ...

  6. VIM基础操作方法汇总

    学习自小甲鱼的视频,快速入门vim 目录: 1.光标移动 2.进入插入模式 3.进入普通模式 4.进入命令行模式 5.退出 6.光标跳跃 7.快速跳转行号 8.删除 9.利用数字重复操作 10.撤回 ...

  7. [LUOGU] P1113 杂物

    题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务完成是必要的,因为 ...

  8. <Redis> 入门二 五种数据类型的操作、通用key的操作、发布订阅

    文档参考:http://www.redis.net.cn/ string - > key value 简单的keyvalue,常规计数:例如微博数,粉丝数 set     -> key v ...

  9. [Python3网络爬虫开发实战] 1.2.4-GeckoDriver的安装

    上一节中,我们了解了ChromeDriver的配置方法,配置完成之后便可以用Selenium驱动Chrome浏览器来做相应网页的抓取. 那么对于Firefox来说,也可以使用同样的方式完成Seleni ...

  10. uva 10596 - Morning Walk

    Problem H Morning Walk Time Limit 3 Seconds Kamal is a Motashota guy. He has got a new job in Chitta ...