zoukankan      html  css  js  c++  java
  • HDU2577 How to Type

    题目链接

    一道 DP 问题

    定义 (operatorname{dp}(i,j)) 为敲完第 (i) 个字母且当前状态为 (j) 的最小花费,(j=1) 代表 Caps Lock(大写锁定)打开,(j=0) 代表 Caps Lock 关闭,则有:

    如果第 (i) 个字母为大写:

    [operatorname{dp}(i,1)=min(operatorname{dp}(i-1,0)+2,operatorname{dp}(i-1,1)+1)\operatorname{dp}(i,0)=min(operatorname{dp}(i-1,0)+2,operatorname{dp}(i-1,1)+2) ]

    如果第 (i) 个字母为小写:

    [operatorname{dp}(i,1)=min(operatorname{dp}(i-1,0)+2,operatorname{dp}(i-1,1)+2)\operatorname{dp}(i,0)=min(operatorname{dp}(i-1,0)+1,operatorname{dp}(i-1,1)+2) ]

    目标状态为 (min(operatorname{dp}(len,1)+1,operatorname{dp}(len,0))),其中 (len) 为字符串长度。

    完整代码:

    #include<bits/stdc++.h>
    using namespace std;
    int dp[105][2];
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    		string str;
    		cin>>str;
    		int len=str.length();
    		memset(dp,0x3f,sizeof(dp));
    		dp[0][0]=0;
    		dp[0][1]=1;
    		for(int i=1;i<=len;i++)
    		{
    			if(str[i-1]>='A'&&str[i-1]<='Z') 
    			{
    				dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+1);
    				dp[i][0]=min(dp[i-1][0]+2,dp[i-1][1]+2);
    			}
    			else
    			{
    				dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+2);
    				dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+2);
    			}
    		}
    		printf("%d
    ",min(dp[len][1]+1,dp[len][0]));
    	}
    	return 0;
    }
    

    提交状态:
    提交状态

  • 相关阅读:
    Android访问数据库(SQL Server 和 MySQL)
    Andriod开发环境搭建
    SQL 学习记录
    安装双系统 win7 + ubuntu 15.04
    SQL资料
    电脑使用
    python_L7
    ONE
    网页性能优化
    js的继承
  • 原文地址:https://www.cnblogs.com/juruo-zzt/p/11962544.html
Copyright © 2011-2022 走看看