http://acm.hdu.edu.cn/showproblem.php?pid=2577

设定两个记录数组,dp[i][0],dp[i][1],代表前i个字母所需要的最小按键数目。区别在于,dp[i][0]的情况是,w[i]这个字母(也就是最后一个)是在lock建关闭的情况下产生的最小数目。而dp[i][1]是在lock建打开的情况下产生的最小数目。

因此分别考虑每种情况的dp公式

char w[]数组记录字符串

当w[i]为大写字母的时候,因为字母种类不是大写的就是小写字母,所以if(w[i]<=‘Z’)一句判断足矣。

dp[i][0] = min(dp[i-1][0]+2,dp[i-1][1]+2);

dp[i][1] = min(dp[i-1][0]+3,dp[i-1][1]+1);

当w[i]为小写字母的时候

dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+1);
dp[i][1]=min(dp[i-1][0]+4,dp[i-1][1]+2);

1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4  int dp[111][2];
5  char w[111];
6 int main(){
7 int n;cin>>n;
8 while(n--){
9 scanf("%s",w);
10 if(w[0]<='Z'){
11 dp[0][0]=2;
12 dp[0][1]=3;
13 }
14 else {
15 dp[0][0]=1;
16 dp[0][1]=4;
17 }
18 for(int i=1;i<strlen(w);i++){
19 if(w[i]<='Z'){
20 dp[i][0] = min(dp[i-1][0]+2,dp[i-1][1]+2);
21 dp[i][1] = min(dp[i-1][0]+3,dp[i-1][1]+1);
22 }
23 else{
24 dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+1);
25 dp[i][1]=min(dp[i-1][0]+4,dp[i-1][1]+2);
26 }
27 }
28 cout<<min(dp[strlen(w)-1][0],dp[strlen(w)-1][1])<<endl;
29 }
30 return 0;
31 }
posted on 2011-05-02 21:05  geeker  阅读(377)  评论(0编辑  收藏  举报