直接爆搜 + 记忆化 + 剪枝为什么能过啊 /yun
  • 板块P8565 Sultan Rage
  • 楼主Leasier
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/10/20 18:56
  • 上次更新2023/10/27 06:45:37
查看原帖
直接爆搜 + 记忆化 + 剪枝为什么能过啊 /yun
201007
Leasier楼主2022/10/20 18:56

RT,代码:

#include <iostream>
#include <map>

using namespace std;

typedef long long ll;

const int mod = 998244353;
ll a[157], sum[157];
map<ll, int> mp[157];

ll dfs(ll n, int m){
	if (n < 0 || n > sum[m]) return 0;
	if (m == 0) return n == 0 ? 1 : 0;
	if (mp[m].count(n)) return mp[m][n];
	return mp[m][n] = (dfs(n, m - 1) + dfs(n - a[m], m - 1)) % mod;
}

int main(){
	int t;
	cin >> t;
	for (int i = 1; i <= t; i++){
		int m, q, k;
		cin >> m >> q;
		k = m;
		for (int j = 1; j <= m; j++){
			cin >> a[j];
		}
		while (a[k] <= 1e18){
			a[++k] = 0;
			for (int j = 1; j <= m; j++){
				a[k] += a[k - j];
			}
		}
		for (int j = 1; j <= k; j++){
			sum[j] = sum[j - 1] + a[j];
			mp[j].clear();
		}
		for (int j = 1; j <= q; j++){
			ll x;
			cin >> x;
			cout << dfs(x, k) << endl;
		}
	}
	return 0;
}
2022/10/20 18:56
加载中...