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; }