[HDU2577]How to Type(DP)

题目链接

题意

给一个大小写字符串,求最少敲击字符串次数,最开始和最后要求shift都是down的。如日常,大小写转换可以ctrl+z或者shift保持 up/down。

题解

两个dp数组,一个表示当前shift状态是up的最小转换次数,一个表示当前shift状态是down的最小转换次数。最后做处理和比较,再加上字符数即可。

代码

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        while(n--!=0) {
            String s=in.next();
            int ans=getMinTypeTime(s);
            System.out.println(ans);
        }
    }

    public static int getMinTypeTime(String s) {
        int[] dpLow=new int[s.length()+1];
        int[] dpUp=new int[s.length()+1];
        dpLow[0]=0;//
        dpUp[0]=1;//
        for(int i=1;i<=s.length();++i) {//
            if(s.charAt(i-1)>='a'&&s.charAt(i-1)<='z') {
                dpLow[i]=Math.min(dpLow[i-1], dpUp[i-1]+1);
                dpUp[i]=Math.min(dpLow[i-1]+1, dpUp[i-1]+1);
            }
            else {
                dpUp[i]=Math.min(dpLow[i-1]+1, dpUp[i-1]);
                dpLow[i]=Math.min(dpLow[i-1]+1, dpUp[i-1]+1);
            }
        }
        return Math.min(dpLow[s.length()], dpUp[s.length()]+1)+s.length();
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/10992258.html

时间: 2024-09-27 14:51:31

[HDU2577]How to Type(DP)的相关文章

HDOJ题目2577 How to Type(dp)

How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4467    Accepted Submission(s): 2034 Problem Description Pirates have finished developing the typing software. He called Cathy to tes

hdu 2577 How to Type(dp)

题意: 输入一行字符串 只包含大小写字母 可以使用shift 和 caps 键 切换大小写 问最少按几次键 思路: if(str[i]>='A'&&str[i]<='Z') { dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+2);//on dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+2);//off } else { dp[i][0]=min(dp[i-1][0]+2,dp[i-1][1]+2); dp[i][1]=mi

HDU 2577 How to Type(dp题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577 解题报告:有一个长度在100以内的字符串,并且这个字符串只有大写和小写字母组成,现在要把这些字符串用键盘输入到电脑中,一开始的时候大写锁定是关闭的,并且要求结束的时候也是关闭的,然后让你求输入这些字符串最少需要按多少次键盘(包括Cap Lock键和Shift键) 一个典型的dp题,定义一个一维数组就够了,然后dp[i]的含义的输入到第i个字符时需要按键的最少次数.然后递推公式如下: dp[i]

SCOI2010 and SXOI2014 股票交易(DP)

明显的单调队列-- 但下面的程序一直有bug 附上题解:http://blog.csdn.net/njlcazl/article/details/8611042 附上我的代码: 1 var head,tail,i,n,maxp,w,t,ans,j:longint; 2 as,bs,ap,bp,q,val:array[0..2020] of longint; 3 f:array[0..2020,0..2020] of longint; 4 function max(x,y:longint):lon

【POJ 3071】 Football(DP)

[POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted: 2222 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all tea

2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-inverse #navbar > .navbar-nav > li > a:hover, .navbar-inverse #navbar > .navbar-nav > li > a:focus { background-image: none; background-color:

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g