题目链接:

题目大意:
给你一个仅仅包括大写和小写字母的字符串,如今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. vc++实现控制USB设备启用与否

    #include <WINDOWS.H>      #include <TCHAR.H>      #include <SETUPAPI.H>      //#in ...

  2. vue之package.json文件解析

    1.package.json是什么? 什么是Node.js的模块(Module)?在Node.js中,模块是一个库或框架,也是一个Node.js项目.Node.js项目遵循模块化的架构,当我们创建了一 ...

  3. adb 设备命令

    一.adb 设备命令1.查看机型时,可以使用以下命令$ adb shell getprop ro.product.model 2.如果我们忘记具体系统属性的名字$ adb shell getprop ...

  4. vue跨域解决方法 及设置api路径方法

    vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' header is prese ...

  5. CentO7-使用plantuml绘制UML类图

    准备工作 到PlantUml官网(http://plantuml.com/download)下载plantuml.jar.官网上还有一个在线的demof服务.plantuml的官网真的很挫! 到官网下 ...

  6. 笔试算法题(42):线段树(区间树,Interval Tree)

    议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节 ...

  7. MYSQL每日一学 - 时间间隔表达式

    参考链接:https://dev.mysql.com/doc/refman/5.7/en/expressions.html Interval表达式(Temporal intervals)的使用 Int ...

  8. python3.x Day5 异常处理

    异常处理: 预计可能会发生的异常,明确如果发生,如何处理,不过一般不参与业务逻辑,也不要一次性捕捉全部异常,不然可能程序就不可控了. data={} mmm=[] try: #捕获异常, data[& ...

  9. centos6 用户登陆管理

    查看当前登陆有哪些用户,在做什么 [root@web01 ~]# w :: up :, users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGI ...

  10. centos6基础优化

    一.关闭SELinux功能 selinux功能太严苛,还是关闭了吧 法一:修改配置文件,永久生效 [root@web01 ~]# sed -i 's/SELINUX=enforcing/SELINUX ...