题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4603
题目大意:给定一个数字x,令t表示一个一位数(0 - 9),可以对x进行以下三种操作:
1.在x后面添加t,即x = x * 10 + t;
2.x加上t,即x = x + t;
3.x乘以t,即x = x * t;
每一步操作有一个花费(共30种花费),求从x变到y的最小花费。
分析:很明显的搜索题目(其实我一开始有尝试贪心,但是做不出来),关键在于优化。用如下几种优化就够了:
1.x + t时t >= 1, x * t时t >= 2(效果不明显)
2.x > y明显不可能。唯一能把x变小的操作就是x * 0 = 0,把状态0加入初始状态集合,后面就不用再考虑这种情况了(重要)
3.若当前操作花费不小于现有最小值,停止操作
其实有了第2条优化就够了,剩下的是数据结构的选择,一开始我一直用优先队列,这样搜索到第一个x = y的情况就可以终止了,这在TOJ上会超时,在CSUOJ上1000+ms。后来改用普通队列,就必须搜索到队列为空。用SPFA,比优先队列快得多,在TOJ上437ms,在CSUOJ上176ms。
#include
#include
#include
#include
#include
#include