短代码.EOF串

一个只包含EOF三个字符的字符串,并且不存在连续的O,问长度为n的这种串有多少种。
其中0<n<40。

递推: e'=e+o+f, o' =e+f, f'=e+o+f
// 预处理查表
main(i,n){__int64 d[39]={1,1,1,3};for(;i<39;i++)d[i][1]=d[i-1][0]+d[i-1][2],d[i][2]=d[i][0]=d[i][1]+d[i-1][1],d[i][3]=d[i][1]+d[i][0]*2;while(~scanf("%d",&n))printf("%I64d\n",d[n][3]);}
// 把eof分开存,去掉二级数组的括号
main(i,n){__int64 e[39]={1},o[39]={1},f[39]={1},s[39]={3};for(;i<39;i++)f[i]=e[i]=(o[i]=e[i-1]+f[i-1])+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);}
// e,f总是一样的,于是去掉f
main(i,n){__int64 e[39]={1},o[39]={1},s[39]={3};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);}
// 与其保存总和,不如结果时计算一下
main(i,n){__int64 e[39]={1},o[39]={1};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1];while(~scanf("%d",&n))printf("%I64d\n",o[n-1]+e[n-1]*2);}
// 不再查表,按需计算
main(i,n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(i=e=o=1;i<n;i++)t=o,e=(o=e+e)+t;}
// 调整一下递推式
main(n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;e=(o=e+e)+t)t=o;}
// 再调整递推式,去掉临时变量
main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;o=e-o)e+=e+o;}
// 多一次循环,结果就是e
main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",e))for(e=o=1;n--;o=e-o)e+=e+o;}
农夫三拳,这下你还能更短吗。嘿嘿嘿:)
原文地址:https://www.cnblogs.com/kaikai/p/823649.html