2017.10.22 最多的方案 失败总结

来源:互联网 发布:mac系统还原到旧版本 编辑:程序博客网 时间:2024/05/29 02:48

老想着数表结合的方法,,结果就是找不到规律。

这个题看起来好像是一个函数就可以做,但其实不是的,斐波那契函数有很好的形势:f【i】=f【i-1】+f【i-2】,

他可以看成两个点转移到一个点,也可以看成一个点拆成两个点,,

所以就按照拆分dp就可以了

注意:相邻的两个有两种情况,一种是两个的拆分互不相关的,一种是右边的多出一个1,需要左边的拆分,需要判断一下可行性

f【位数】【是否越界一个1】


码:

#include<iostream>#include<cstdio>using namespace std;#define ll long longll o,f[999],i,ff[99][2],wz[99],tot;int main(){f[0]=1;f[1]=1;for(i=2;i<=91;i++)f[i]=f[i-1]+f[i-2];scanf("%lld",&o);for(i=91;i>=1;i--){if(o>=f[i]){wz[++tot]=i;//cout<<i<<" "<<f[i]<<endl;o-=f[i];}}wz[++tot]=0;ff[0][0]=1;ff[0][1]=0;for(i=1;i<tot;i++){//ff[i][0]为不拆最后一个//ff[i][1]为拆最后一个 ff[i][0]=ff[i-1][0]*((wz[i]-wz[i+1]-1)/2+1)+ff[i-1][1]*((wz[i]-wz[i+1]-1)/2); //继承 if((wz[i]-wz[i+1]-1)%2)ff[i][1]=ff[i-1][1]+ff[i-1][0];}printf("%lld",ff[tot-1][0]);}


阅读全文
0 0
原创粉丝点击