UVA
来源:互联网 发布:pc读取s7 200plc数据 编辑:程序博客网 时间:2024/06/03 19:43
提莫链接:Power Calculus
本题用到了IDA*。IDA*适用于没有明显上界的搜索。显然,如果没有明显上界,dfs会一直搜下去。如果用广搜的话代码量很大并且会耗费大量内存。那么IDA*就被发明出来了,它结合了dfs和bfs的优点,既可以像广搜那样层层递进的搜索,又不会耗费大量内存。
IDA*设置了一个上界maxd,maxd不断+1,每次搜的深度最大为maxd,这样就实现了像广搜那样一层一层的搜。记录路径只需要开一个数组就可以。此外,maxd还可以用来剪枝。本题中如果当前深度d大于maxd,或者剩余的步数中所能达到的最大值都达不到n(即每次都乘2),则return。
本题中每次优先加上较大的数会更快的达到目标值。而且每次得到的数t需要大于零,并且由于n最大为1000,所以t需要小于2000,如果大于等于2000了,那么最后几步必定是多余的。val[]记录每次得到的值。
代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,maxd,flag,val[2005];void dfs(int d){ if(d>maxd || val[d]<<(maxd-d) < n) return; if(val[d]==n) { flag=1; return; } for(int i=d;i>=0;i--) { int t=val[d]+val[i]; if(t>0 && t<2000) { val[d+1]=t; dfs(d+1); if(flag) return; } t=val[d]-val[i]; if(t>0 && t<2000) { val[d+1]=t; dfs(d+1); if(flag) return; } }}int main(){ while(scanf("%d",&n) && n) { val[0]=1; flag=0; for(maxd=0;;maxd++) { dfs(0); if(flag) break; } printf("%d\n",maxd); } return 0;}
阅读全文
2 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- [bzoj3037][贪心]创世纪
- Oracle:连接合并列的输出
- mysql 主从复制
- jQuery基础系列(二):jQuery属性操作方法
- Android studio中todo的用法
- UVA
- 项目浪费时间统计表
- day05笔记
- java关于线程的sleep(),yield(),join(),wait(),notify(),notifyAll()等方法的总结
- Java(opencv) 窗体打开摄像头
- JAVA中outer,inner,continue的使用
- 如何快速的学习新技术?
- opensparc中的crossbar
- day06笔记