看了递推的题解,感觉递归在这个时候有不少优势了,虽然时间的差距还是有点
思路:对于每次搜索到某个位置的时候,可能有两个状态,大写开,大写关,记录下到达某个位置的两个状态的最优解。
注意大写开的,最后还得+1,把它关了。
#include<stdio.h>
#include<string.h>
int visited[105][3];
char s[105];
int dfs(int ,int );
int sl;
int main()
{
int t;
for(scanf("%d",&t);t;t--)
{
scanf("%s",s);
sl=strlen(s);
memset(visited,-1,sizeof(visited));
printf("%d\n",dfs(0,0));
}
return 0;
}
int dfs(int now,int caps)
{
int k1,k2,k3,min;
k1=k2=k3=min=0x7fffffff;
if(visited[now][caps]!=-1) return visited[now][caps];
if(now==sl)
if(caps) return 1;
else return 0;
if(s[now]>='A'&&s[now]<='Z')
if(caps)//大写开
k1=1+dfs(now+1,caps);
else
{
k2=2+dfs(now+1,caps);//用shift
k3=2+dfs(now+1,1);//开大写
}
else
{
if(!caps)//大写关
k1=1+dfs(now+1,caps);
else
{
k2=2+dfs(now+1,caps);//用shift
k3=2+dfs(now+1,0);//大写关
}
}
if(k1<k2) min=k1;
else min=k2;
if(k3<min) min=k3;
visited[now][caps]=min;
return min;
}