HDU 2577 How to Type

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577


思路:动态规划(dp)

    

       令a[i]为输入第i个字符后CapsLock打开状态,b[i]关闭;则有如下:

      

       1)若第i个字符为小写

                                                                              (之前状态转移至当今状态)

            a[i]=min(a[i-1]+2,b[i-1]+2)  ;          开:shift+字符;             关:字符+CapsLock;

            b[i]=min(a[i-1]+2,b[i-1]+1)  ;          开:CapsLock+字符;   关:字符;

  

    2)大写


            a[i]=min(a[i-1]+1,b[i-1]+2)  ;          开:字符;                        关:CapsLock+字符;

            b[i]=min(a[i-1]+2;b[i-1]+2) ;           开:字符+CapsLock;    关:shift+字符;


#include<stdio.h>
#include<string.h>
#define min(a,b) (a)<(b)?(a):(b)
int a[103],b[103];
int main()
{
   int t,i,len;
   char ch[103];
   scanf("%d",&t);
   while(t--)
   {
      scanf("%s",ch);
	  len=strlen(ch);
	  a[0]=1;b[0]=0;
	  
	   for(i=0;i<len;i++)
	   {
	     if(ch[i]>='a'&&ch[i]<='z')
		 {
		    a[i+1]=min(a[i]+2,b[i]+2);
			b[i+1]=min(a[i]+2,b[i]+1);
		 }
		 else
		 {
		    a[i+1]=min(a[i]+1,b[i]+2);
			b[i+1]=min(a[i]+2,b[i]+2);
		 }
	   }
	   a[len]++;
       printf("%d\n", min(a[len],b[len]));
   }
   return 0;
}


       

        


 

你可能感兴趣的:(HDU 2577 How to Type)