哈哈~这题秒掉了,总的来说这些天的DP苦修还是有点成果的。哇哈哈哈。
做题过程大概是这样的,前几天看了下这题,完全不敢切,果断的没思路。今天再一看,在纸上用笔演练了下,发现基本上能推出公式了。呵呵,蛮好玩的么,DP,虽然只是道水题,但是也说明了我在进步啊~ 哈哈哈
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int min( int a,int b ){ return a<b?a:b; }
int main()
{
int T;
scanf( "%d",&T );
while( T-- )
{
char date[111];
scanf( "%s",&date );
int f[111][2];
memset( f,0,sizeof(f) );
f[0][1]=1;
if( date[0]>='A' && date[0]<='Z' )
f[0][1]+=1,f[0][0]+=2;
else
f[0][1]+=2,f[0][0]+=1;
for( int i=1;i<=strlen(date);i++ )
{
int low,high;
if( date[i]>='A' && date[i]<='Z' )
low=0,high=1;
else
low=1,high=0;
if( high )
{
f[i][1]=min( f[i-1][1]+1,f[i-1][0]+2 );
f[i][0]=min( f[i-1][1]+2,f[i-1][0]+2 );
}
else
{
f[i][1]=min( f[i-1][1]+2,f[i-1][0]+2 );
f[i][0]=min( f[i-1][1]+2,f[i-1][0]+1 );
}
}
printf( "%d\n",min(f[strlen(date)-1][0],f[strlen(date)-1][1]+1) );
}
return 0;
}