首页 > 其他 > 详细

Codeforces 251C Number Transformation DP, 记忆化搜索,LCM,广搜

时间:2019-06-03 11:52:50      阅读:82      评论:0      收藏:0      [点我收藏+]

题意及思路:https://blog.csdn.net/bossup/article/details/37076965

代码:

#include <bits/stdc++.h>
#define LL long long
#define INF 1e18
using namespace std;
int lcm(int x, int y) {
	return x * y / __gcd(x, y);
}
const int maxn = 500010;
LL a, b, k;
LL dp[maxn];
unordered_map<LL, bool> v;
queue<pair<LL, LL> > q;
LL bfs(LL x, LL y) {
	q.push(make_pair(x, 0));
	while(!q.empty()) {
		pair<LL, LL> tmp = q.front();
		q.pop();
		if(v[tmp.first]) continue;
		v[tmp.first] = true;
		if(tmp.first == y) return tmp.second;
		for (int i = 2; i <= k; i++) {
			if(tmp.first % i != 0) {
				q.push(make_pair(tmp.first - tmp.first % i, tmp.second + 1));
			}
		}
		q.push(make_pair(tmp.first - 1, tmp.second + 1));
	}
}
LL dfs(LL x) {
	if(dp[x] != -1) return dp[x];
	LL tmp = INF;
	for (int i = 2; i <= k; i++) {
		if(x % i != 0)
			tmp = min(tmp, dfs(x - x % i));
	}
	tmp = min(tmp, dfs(x - 1));
	return dp[x] = tmp + 1;
}
int main() {
	int LCM = 1;
	scanf("%lld%lld%d", &a, &b, &k);
	for (int i = 2; i <= k; i++) {
		LCM = lcm(LCM, i);
	}
	memset(dp, -1, sizeof(dp));
	dp[0] = 0;
	for (int i = 1; i < LCM; i++) {
		dfs(i);
	}	
	LL ans = 0;
	if(a - a % LCM >= b) {
		ans += dp[a % LCM];
		a -= a % LCM;
	}
	LL del = a - b;
	LL tmp = del / LCM;
	a -= tmp * LCM;
	ans += tmp * (dp[LCM - 1] + 1);
	if(a > b) {
		LL tmp = bfs(a, b);
		ans += tmp;
	}
	printf("%lld\n", ans);
} 

  

Codeforces 251C Number Transformation DP, 记忆化搜索,LCM,广搜

原文:https://www.cnblogs.com/pkgunboat/p/10966377.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!