UVA529 Addition Chains (IDA*)

UVA529 Addition Chains (IDA*)

题目描述
uva529
传送门
这道题用了IDA*, (虽然我不太会)
(PS: 思路来源: 李煜东《算法竞赛进阶指南》CD附带代码)

可以发现一个很好的性质, 就是:

当前数列末尾数为a时, 凑成b至少需要 l o g 2 ( b / a ) log_2(b/a) log2(b/a) 步. 因为用a凑b的话, 可以看成凑成 2 n a = b 2^na = b 2na=b, 因为每次可以增大a的 2 n 2^n 2n(n为第几次), 所以n就是就是最小步数, 等于 l o g 2 ( b / a ) log_2(b/a) log2(b/a) , 所以估价函数就可以利用这个性质

(1,2 无法算出正确值, 只好打表了)

上代码(本人比较喜欢重载, 码风有点丑, 敬请原谅):

# include <iostream>
# include <cstdio>
# include <algorithm>
# include <cmath>
# include <cstring>
# include <cstdlib>

using namespace std;

# define rep(i,j,k) for(int i=j;i<=k;i++)
# define per(i,j,k) for(int i=j;i>=k;i--)
# define clr(a) memset(a,0,sizeof(a))
# define vbg(a) memset(a,0x7f,sizeof(a))
# define sml(a) memset(a,0xff,sizeof(a))

const int MAX = 10010, INF = 0x3f3f3f3f;

int n, ans[MAX], lg2[MAX], maxdepth;

int log2 (int a) {
	int ans = 0, now = 1;
	for (; now < a; now *= 2, ans ++);
	return ans;
}

int Laststep (int depth) {
	if (ans[depth] > n)	return INF;
	return lg2[(int) ceil ( (double) n / ans[depth])];
}

void First () {
	int i;
	rep(i,1,MAX - 1) {
		lg2[i] = log2 (i);
	}
	return;
}

void Init () {
	cin>> n;
	if (n == 0)	exit (0);
	clr (ans);
	return;
}

bool IDA_star (int depth) {
	int i, j, last;
	per (i,depth - 1, 0) {
		if (ans[i] + ans[i] <= ans[depth - 1])	break;
		per(j,i,0) {
			if (ans[i] + ans[j] <= ans[depth - 1])	break;
			ans[depth] = ans[i] + ans[j];
			last = Laststep (depth);
			if (last == 0)	return 1;
			else if (last + depth < maxdepth) {
				if (IDA_star (depth + 1)) {
					return 1;
				}
			}
		}
	}
	return 0;
}

bool Solve () {
	if (n == 1) {
		cout<< "1"<< endl;
		return 1;
	}
	if (n == 2) {
		cout<< "1 2"<< endl;
		return 1;
	}
	ans[0] = 1;
	maxdepth = Laststep (0);
	for (; IDA_star (1) == 0;) maxdepth ++;
	int i;
	rep(i,0,maxdepth - 2) {
		cout<< ans[i]<< " ";
	}
	cout<< ans[maxdepth - 1]<< endl;
	return 0;
}
	
int main () {
	First ();
	for (; 1; ) {
		Init ();
		if (Solve ())	continue;
	}
	return 0;
}

评测记录:

记录

马尔科夫链(Markov chains)是一种数学模型,它描述了在给定过去状态的情况下,未来状态的概率分布只与当前状态有关,与过去状态无关。马尔科夫链的本质在于其具有马尔科夫性质,即无记忆性。 在马尔科夫链中,系统存在一组状态,每个状态之间存在概率转移的关系。通过转移概率矩阵(transition matrix),我们可以描述状态之间的概率转移。该矩阵的行数和列数等于系统状态的数量,矩阵中的元素表示从一个状态转移到另一个状态的概率。 通过马尔科夫链,我们可以研究随机过程中状态的演化。在随机游走、物理学、生态学、经济学等领域,马尔科夫链都有着广泛应用。例如,在随机游走中,马尔科夫链可以帮助我们分析某个随机漫步者在不同位置之间的概率转移;在经济学中,马尔科夫链可以用于描述不同经济周期之间的转移。 此外,马尔科夫链还有一些重要的性质和概念,如吸收概率、平稳分布、遍历性等。吸收概率是指从某个状态开始,最终进入某个特定状态的概率。平稳分布表示在长时间内,系统状态的概率分布保持不变。而遍历性用于描述从任意状态开始,最终可以访问到所有其他状态的性质。 总之,马尔科夫链是一种重要的数学模型,用于研究随机过程中状态的演化以及系统的稳定性。它的应用领域广泛,并且在概率论、统计学和计算机科学等领域中都有重要的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值