poj 2248 DFS+剪枝
2012-03-04 20:15
246 查看
由于每个数字都是由前面的两个数字之和。并且要使这个数字链最短。那么我们可以深搜一下,假设后面的数是由前面的两个数字的和,前面的两个数是我们可以逐渐往前扫描,那么算符就是前面的两个数相加,得到后面的数,这样深搜下去,并且记录找到解后这个数据链的长度。当数据长度最短时即为所求的解,这里为了加快寻找速度,对于一些不必要搜索的我们不需要去搜索,于是就把它剪去。
点击打开链接
#include<iostream> #include<cstdio> #include<cstdlib> #define MAX 105 using namespace std; int a[MAX],r[MAX], b[2*MAX]; int n,ans; void init(int n) { int i; ans = n; a[0] = 1; for(i=n; i<=n+n; i++) b[i] = 0; for(i=n-1; i>0; i--) b[i]=b[i+i]+1; //b[i]中记录着到当前数最短的距离数 } void printf() { int i; for(i=0; i<ans; i++) printf("%d ",r[i]); printf("%d\n",n); } void dfs(int l) { int i, k; if(l+b[a[l]]>=ans) return; if(a[l]==n) { ans = l; for(i=0; i<l; i++) r[i]=a[i]; return; } for(i=l; i>=0; i--) for(k=i; k>=0; k--) { a[l+1]=a[i]+a[k]; if(a[l+1]>a[l]&&a[l+1]<=n) dfs(l+1); } } int main() { while(scanf("%d",&n)&&n) { init(n); dfs(0); printf(); } system("pause"); return 0; }
点击打开链接
相关文章推荐
- POJ 1011 Sticks 经典的dfs+剪枝
- POJ - 2531 Network Saboteur解题报告(dfs+剪枝)
- poj 1724 dfs+剪枝
- POJ 2248 Addition Chains 笔记
- POJ2248 Addition Chains
- POJ 2531-Network Saboteur(dfs+剪枝)
- POJ1011 DFS+剪枝
- poj 1011 Sticks(dfs+剪枝)
- POJ 2531 Network Saboteur(DFS+剪枝)
- poj 2248 Addition Chains
- poj 1054The Troublesome Frog(几何——>dfs+剪枝)
- POJ 2248 & ZOJ 1937 Addition Chains
- poj 2248
- poj(1011)——Sticks(经典的dfs+剪枝)
- POJ 2248
- poj1011 Sticks(dfs+剪枝)
- poj 3009 dfs+剪枝
- poj 2362 || zoj 1909 Square (DFS+剪枝)
- POJ 1011 Sticks 经典的DFS+剪枝
- POJ 2248 迭代加深搜索