HDU2577(DP)

题目链接:传送门
分析:题意大概是打一段字符串,可以用cap locks键,也可以用shift键加字母键,最后得保证cap lock键是关闭的
思路:第一眼知道是DP,然而却不知道怎么找状态方程,看了网上题解后,大概就是定义两个数组表示两个状态,一个状态是关了cap键,一个是开着。
AC代码:

#include<cstdio>		//头文件模板
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
int main(){
	char ch[105];
	int a[105],A[105];
	int t;
	cin>>t;
	while(t--){
		scanf("%s",ch+1);	//字符串从1开始输入
		memset(a,0,sizeof(a));
		memset(A,0,sizeof(A));
		a[0]=0;	A[0]=1;	//定义初始状态
		int i;
		for(i=1;ch[i];i++){
			if(ch[i]>='a'&&ch[i]<='z'){//当输入小写时
				a[i]=min(a[i-1]+1,A[i-1]+2);//下一个是关闭状态;
				//若前一个状态时小写,就只用加1
				//若前一个状态是大写键,选择shift+字母键
				A[i]=min(a[i-1]+2,A[i-1]+2);		//下一个是cap开启状态
				//若前一个状态是小写,就把caps开启,再输入字母
				//若前一个状态是大写状态,就shift+字母键
				//下面同理
			}
			if(ch[i]>='A'&&ch[i]<='Z'){
				a[i]=min(a[i-1]+2,A[i-1]+2);
				A[i]=min(a[i-1]+2,A[i-1]+1);
			}
		}
		 int num;
		 num=min(a[i-1],A[i-1]+1);
		cout<<num<<endl;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值