梦,才是最真的现实

导航

hdu 2577 how totype 记忆化递归

看了递推的题解,感觉递归在这个时候有不少优势了,虽然时间的差距还是有点

思路:对于每次搜索到某个位置的时候,可能有两个状态,大写开,大写关,记录下到达某个位置的两个状态的最优解。

注意大写开的,最后还得+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;
}


posted on 2012-06-21 15:48  梦,才是最真的现实  阅读(157)  评论(0编辑  收藏  举报