该题dfs怎么转记忆化数组啊!
查看原帖
该题dfs怎么转记忆化数组啊!
1087539
shark_zz楼主2024/3/30 18:17

想学一下记忆化数组的解法

#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <cstring>

#define endl '\n'

using namespace std;
using ll = long long;

const int N = 1010;

int n, m, k;
ll res;
ll mem[10][210][210];

//u是当前在第几个空,val当前是第几个数,sum的当前的总和
ll dfs(int u, int val, int sum) {
	if (mem[u][val][sum]) return mem[u][val][sum];
	if (val > n || sum > n) return 0;
	if (u > k) {
		if (sum == n) {
			return mem[u][val][sum] = 1;
		}
		return mem[u][val][sum] = 0;
	}
	ll temp = 0;

	//不选当前这个数
	temp += dfs(u, val + 1, sum);
	//选这个数
	temp += dfs(u + 1, val, sum + val);

	//我感觉temp+=dfs(u, val + 1, sum)和dfs(u + 1, val, sum + val)
	//这一步有问题,但我不知道问题出在哪
	return mem[u][val][sum] = temp;
}

/*
void dfs(int u, int val, int sum) {
	if (val > n || sum > n) return;
	if (u > k) {
		if (sum == n) res++;
		return;
	}
	dfs(u + 1, val, sum + val);
	dfs(u, val + 1, sum);
}	
*/

int main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin >> n >> k;
	cout << dfs(1,1,0);
	return 0;
}
2024/3/30 18:17
加载中...