50pts 记忆化搜索求助!
查看原帖
50pts 记忆化搜索求助!
494699
卷王慢即快楼主2023/1/28 11:42
#include <bits/stdc++.h>
using namespace std;
#define INF 2147483647
int n, m, ans = INF;
int t[507];
int f[507][107]; //记忆化, f[i][j] = dfs(i, j) 
inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9')
	{
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
inline int dfs(int k, int x)
{
	if(k == 1) return f[k][x] = x;
	if(f[k][x] != -1) return f[k][x];
	int cnt = INF;
	for(int i = 0; i < m * 2; i++) //枚举 k' 
		if(t[k - 1] + i == t[k] + x || t[k - 1] + i + m <= t[k] + x) //分析的两种情况 
			cnt = min(cnt, dfs(k - 1, i) + x);
	return f[k][x] = cnt;
}
int main()
{
	n = read(), m = read();
	for(int i = 1; i <= n; i++)
		t[i] = read();
	sort(t + 1, t + n + 1); //一 定 要 排 序 ! ! ! 
	memset(f, -1, sizeof(f));
	for(int i = 0; i < m * 2; i++)
		ans = min(ans, dfs(n, i));
	printf("%d", ans);
	return 0;
}
2023/1/28 11:42
加载中...