2021GDCPC (B)
作者:互联网
B
思路
看时间复杂度肯定是预处理o1查询,每个数字只能选择一次,可以使用01背包求解
f[i]+=f[i-a[j]*a[j],枚举i时,使用一个变量max,表示上一层枚举到的最大值,如果使用N的话其实好多f[i]并没有更新
代码:
int fib[N];
int f[N];
void init() {
fib[0] = fib[1] = 1;
f[0] = 1;
for (int i = 2;i <= 36;i++) fib[i] = fib[i - 1] + fib[i - 2];
int mmax=0;
for (int i = 0;i <= 35;i++) {
mmax=min(N-5,mmax+fib[i]);
for (int j = mmax;j >= fib[i];j--) {
f[j] += (f[j - fib[i]] * fib[i]) % mod;
f[j] %= mod;
}
}
}
void solve() {
int n = read();
printf("%lld\n", f[n]);
clean();
}
标签:int,void,fib,枚举,使用,2021GDCPC,mod 来源: https://www.cnblogs.com/koto-k/p/16165083.html