AcWing 3093. 最多的方案
原题链接
困难
作者:
偷月亮的猫
,
2024-12-29 18:19:37
,
所有人可见
,
阅读 1
N 数据范围太大了,数组爆内存,所以用map记忆化
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, int> PII;
const int N = 1e4 + 10;
LL f[N], n;
map<PII, int> Map;
int dfs(LL x, int i) {
int res = 0;
if (Map.find({x, i}) != Map.end())
return Map[{x, i}];
if (x == 0)
return 1;
if (x >= f[i])
res += dfs(x - f[i], i - 1);
if (x < f[i + 1])
res += dfs(x, i - 1);
return Map[{x, i}] = res;
}
int main() {
cin >> n;
f[1] = 1, f[2] = 2;
int i = 3;
while (1) {
f[i] = f[i - 1] + f[i - 2];
if (f[i] > n) {
cout << dfs(n, i - 1) << endl;
break;
}
i++;
}
return 0;
}