BZOJ 2660: [Beijing wc2012]最多的方案 DP+贪心
这个还是非常神仙的...
code:
#include <cstdio> #include <algorithm> #define N 1006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; ll f[N][2],fib[N],a[N],p,n; int main() { // setIO("input"); int i,j; fib[1]=1,fib[2]=2; for(i=3;i<=88;++i) fib[i]=fib[i-1]+fib[i-2]; scanf("%lld",&n); ll re=n; for(i=88;i>=1;--i) { if(!re) break; if(re>=fib[i]) { a[++p]=i; re-=fib[i]; } } if(re) printf("0\n"); else { sort(a+1,a+1+p); f[1][1]=1; f[1][0]=(a[1]-1)/2; for(i=2;i<=p;++i) { f[i][1]=f[i-1][0]+f[i-1][1]; f[i][0]=f[i-1][0]*((a[i]-a[i-1])/2)+f[i-1][1]*((a[i]-a[i-1]-1)/2); } } printf("%lld\n",f[p][0]+f[p][1]); return 0; }