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

浙公网安备 33010602011771号