http://acm.hdu.edu.cn/showproblem.php?pid=2577
对于每个字母之前的字母有两种状态 1.tab开启 2.tab没有开启,有数组分别记录两种状态下的最短时间,接下来状态转移方程:
0代表没开,1代表开了,对当前字母分类
小写字母:
dp[i+1][0]=min( dp[i][0]+1,dp[i][1]+2);
dp[i+1][1]=min(dp[i][0]+2,dp[i][1]+2);大写字母:
dp[i+1][0]=min(dp[i][0]+2,dp[i][1]+2);
dp[i+1][1]=min(dp[i][0]+2,dp[i][1]+1);
#include "stdio.h"
#include "string.h"
#define min(a,b) (a)<(b)?(a):(b)
char str[105];
int dp[105][2]; //前i个字符 开关tab状态下的时间
int main()
{
int t;
scanf("%d",&t);
getchar();
while( t-- )
{
gets(str);
int len = strlen(str);
memset(dp,0,sizeof(dp));
dp[0][1] = 1;
for( int i=0; i<len; i++ )
{
if( str[i]<='z' && str[i] >='a' )
{
dp[i+1][0] = min(dp[i][0]+1,dp[i][1]+2);
dp[i+1][1] = min(dp[i][0]+2,dp[i][1]+2);
}
else
{
dp[i+1][0] = min(dp[i][0]+2,dp[i][1]+2);
dp[i+1][1] = min(dp[i][0]+2,dp[i][1]+1);
}
}
printf("%d\n",min(dp[len][0],dp[len][1]+1) );
}
return 0;
}