hdu2577 How to Type

拿到这个题,我们先来读一遍 看这里

英文不好,放弃

这道题的大意就是给你一个字符串,求打出它最少需要按多少次键盘

那么有以下几种可能:

1、caps lock锁定,输出大写

2、caps lock未锁定、按一次shift,输出一个大写

3、caps lock未锁定,输出小写

还有最坑的一项!!!caps lock锁定时按shift可以输出小写!!!(我当时被坑了好久......)
很明显的dp(据说模拟也可以)

接下来我们就开始愉快地推转移方程啦

根据我们之前写的可能性,可以写出以下几个式子

 

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

当字符大写时,输入结束后是否是大写状态

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

小写时,状态同上

 

其中i是字符串下标,0/1是状态(是否是大写)

再接下来。。。好像就没啦?

代码献上(写的这么烂就别抄了嘛)

#include<bits/stdc++.h>
using namespace std;
string a;
int dp[105][2];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>a;
        int la=a.size();
        for(int i=0;i<la;i++)
        {
            dp[i][0]=0;
            dp[i][1]=1;
        }
        if(a[0]>='A'&&a[0]<='Z') dp[0][0]=1,dp[0][1]=1;
        for(int i=1;i<la;i++)
        {
            if(a[i]>='A'&&a[i]<='Z')
            {
                dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+1);
                dp[i][1]=min(dp[i-1][1],dp[i-1][0]+1);
            }
            if(a[i]>='a'&&a[i]<='z')
            {
                dp[i][0]=min(dp[i-1][0],dp[i-1][1]+1);
                dp[i][1]=dp[i-1][1]+1;
            }
        }
        cout<<min(dp[la-1][0],dp[la-1][1]+1)+la<<endl;//注意最后如果是大写状态的话还要再按一次锁定键!!
    }
    return 0;
}

然后,好像就AC啦?

 

蒟蒻进阶第一步——dp  未完待续......

posted @ 2019-11-30 15:16  枣子*1  阅读(156)  评论(0编辑  收藏  举报