poj2908解题报告

来源:互联网 发布:阿里云设置dns解析 编辑:程序博客网 时间:2024/05/21 12:33

很不错的一道广搜题。题目给出nop个操作,由N(什么都不做),S(置1),C(置0),F(反转)等基本操作组成,每一种操作会产生不同的热量。又给出nw组初始字符串和目标字符串,要求出将初始字符串转化成目标字符串至少需要产生的热量;有可能没有解,此时输出“NP”。

这道题有两个关键,第一是优先队列的思想,而且必须是自己写的优先队列,STL一般是会超时的。本程序优先队列部分参考《算法导论》(在这道题里就是小根堆)。第二个关键就是必须在每次出队的时候判断是否达到转移目标,是则结束搜索。可能会觉得这样不能保证最优解。比如对于操作1,2,3,4(产热记为Q1,Q2,Q3,Q4),有可能1+3和2+4都能达到目标状态;不妨设Q1=1,Q2=2,Q3=5,Q4=2(显然2+4是最优解),这样的话操作1先于操作2入队,然而这是不是就会导致程序先搜索1+3,从而不正确地退出呢?不会的。虽然1+3确实先入队,但是要注意,这里使用的是优先队列,2+4会“优先”出队,故最优解得到了保证。

当然此题还需要把hash写好,直接使用STL中的map也是会超时的。

 

 

原创粉丝点击