思路: 记忆化搜索。和洛谷上那道括号匹配的题几乎是一样的。
x是当前剩余50的数量,y是剩余100的数量。
纯暴力三个点超时,所以每次DFS完了,把当前找到的方式数量记录下来,不再重复的去DFS。
代码:
#include <bits/stdc++.h>
using namespace std;
long long ans,dp[30][30];
long long dfs(int x,int y) {if (x < y) return 0;if (!x && !y) {return 1;}if (dp[x][y]) return dp[x][y];long long res1=0, res2=0;if (x) {res1 = dfs(x - 1, y);dp[x - 1][y] = res1;}if (y) {res2 = dfs(x, y - 1);dp[x][y - 1] = res2;}return res1 + res2;
}
int main() {int l, r;cin >> l;r = l;ans = dfs(l,r);cout << ans << endl;return 0;
}