uva 529 Addition Chains

news/2024/11/7 1:29:20/

题目地址:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=470

题目描述:



  Addition Chains 

An addition chain for n is an integer sequence $<a_0, a_1, a_2, \dots, a_m>$ with the following four properties:

  • a0 = 1
  • am = n
  • a0<a1<a2<...<am-1<am
  • For each k ( $1 \le k \le m$) there exist two (not neccessarily different) integers i and j ($0 \le i, j \le k-1$) with ak =ai +aj

You are given an integer n. Your job is to construct an addition chain for n with minimal length. If there is more than one such sequence, any one is acceptable.

For example, <1,2,3,5> and <1,2,4,5> are both valid solutions when you are asked for an addition chain for 5.

Input Specification 

The input file will contain one or more test cases. Each test case consists of one line containing one integer  n  (  $1 \le n \le 10000$ ). Input is terminated by a value of zero (0) for  n .

Output Specification 

For each test case, print one line containing the required integer sequence. Separate the numbers by one blank.


Hint: The problem is a little time-critical, so use proper break conditions where necessary to reduce the search space.

Sample Input 

5
7
12
15
77
0

Sample Output 

1 2 4 5
1 2 4 6 7
1 2 4 8 12
1 2 4 5 10 15
1 2 4 8 9 17 34 68 77
题意:

a[0]=1 a[m]=n,a序列为严格递增序列, 对于任意的下标k在[1,m]内 都存在 1 <= j <= i <= k-1  使得 a[i]+a[j]=a[k],找出m最小的符合条件的序列,即长度最小的序列。

题解:

迭代深搜+剪枝

刚开始仅仅是DFS+剪枝,结果怎么剪都不行,过个300的数据就卡半天。无奈解题报告,说是迭代深搜。

迭代深搜其实就是DFS的变种(变种特别特别多,灵活变种与组合),即是一种限定了搜索深度的DFS,然后利用已限定的深度可以做各种各样的剪枝和其他操作,而整体模式更像是BFS,该深度没有答案,则深度+1,就像是一层一层的广度搜索。其实带有BFS思想的DFS以前也是写过的,也可以说算是这么一种。

对于剪枝:

1、当前深度要填的数 肯定来自于它前几位中,较大的两位组成,且其和 要小于等于末端值n 又要大于前一位的值(序列严格递增)。即  a[k-1] < a[i]+a[j]  <= n

2、对于当前要填的值 temp,由于已经确定了深搜的深度,那么 我们按最大的取值(i,j都取前一位,即a[k-1]*2) 延伸到 最大深度时候的temp,如果其值都比n小(能取的最大值都比n小),意味着在这趟搜索中它永远不可能达到n,所以剪掉这支。

代码:

/*
use IDS I have not any other way to solve it
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[1000]={1};//a[0]=1
int n=0;
int depth=0;
int flag=0;//find the min length
/*DFS the sequence place schedule*/
int DFS(int len,int depth)
{if(flag) return(0);if(len==depth&&a[len-1]==n){flag=1;return(0);}else{int i=0,j=0;for(i=len-1;i>=0;i--){for(j=i;j>=0;j--){if(a[i]+a[j]<=n&&a[i]+a[j]>a[len-1])//prune,the sequence is strictly increasing{a[len]=a[i]+a[j];//prune,IDS pruneint temp=a[len];int k=0;for(k=len+1;k<=depth;k++){temp*=2;}if(temp<n){continue;}DFS(len+1,depth);if(flag) return(0);}}}}return(0);
}
/*for test*/
int test()
{//find the law or formulaint i=300;for(i=1;i<=300;i++){printf("%d\n",i );}return(0);
}
/*main process*/
int MainProc()
{while(scanf("%d",&n)!=EOF&&n>0){//inita[0]=1;depth=0;int temp=1;while(temp<n){depth++;temp*=2;}depth++;//at least depth,temp>=n so depth++,it at least (not must) be this area,not the tem<n area,depth is same as lenflag=0;while(!flag){DFS(1,depth);if(!flag){depth++;}}//outprintf("%d",a[0] );int i=0;for(i=1;i<=depth-1;i++){printf(" %d",a[i] );}printf("\n");}return(0);
}
int main(int argc, char const *argv[])
{/* code *///test();MainProc();return 0;
}


http://www.ppmy.cn/news/884494.html

相关文章

leetcode 529. Minesweeper 扫雷游戏 + 经典的DFS深度优先遍历

Let’s play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representing the game board. ‘M’ represents an unrevealed mine, ‘E’ represents an unrevealed empty square, ‘B’ represents a revealed blank square that has no a…

ZTE Q529C root成功方法

ZTE Q529C root成功方法 本人是Android开发工程师&#xff0c;由于公司买了一个中兴ZTE Q529C的手机&#xff0c;一直找相应的root教程。但是网上几乎没有相应的说明&#xff0c;有的方法也是不可行的。今天早上进行再次root&#xff0c;结果成功了。 root的结果如下 Root工具…

529. 扫雷游戏 DFS

529. 扫雷游戏 2020/8/20每日一题打卡√ 题目描述 解题思路 感觉这个题最难的点还是在于理解题意和样例 理解了之后就很明确了&#xff0c;就是正常的DFS 如果点击了雷&#xff0c;就爆炸 如果没点到雷&#xff0c;就判断这个位置旁边有没有雷&#xff1b;如果有雷&#xff…

uva 529 - Addition Chains

此题使用迭代加深搜索。。 注意:1.首先确定最少的步数 2.剪枝:获得当前数t之后。。。看 t * 2(的maxd -d次方)能不能大于n&#xff0c;反之则不用再dfs下去了。 // // main.cpp // uva 529 - Addition Chains // // Created by XD on 15/8/8. // Copyright (c) 2015年…

【ID搜索】uva529Addition Chains

题目描述&#xff1a;对于一个数列{a}&#xff0c;任意一个数都比前面的数大&#xff0c;且是前面任意两个数&#xff08;可以是同一个数&#xff09;之和。a01。求得到n的最短数列&#xff08;最优解不为一&#xff09;。 样例&#xff1a; 输入 5 7 12 15 77 0 输出…

java 中\u767b\u5f55\u6210\u529f编码转成明文

new String("\u767b\u5f55\u6210\u529f".getBytes(),"utf-8") 如果不是utf-8&#xff0c;则可以替换成 unicode

[VRFC 10-529] concurrent assignment to a non-net an is not permitted [C:/Users/chenxy/Desktop/digit

[VRFC 10-529] concurrent assignment to a non-net an is not permitted ["C:/Users/chenxy/Desktop/digit&#xff0c; 这个错误的意思是&#xff0c;对一个非网口类型的 an 同时赋值是不被允许的&#xff0c;也就是说&#xff0c;你在多个模块里都存在对an赋值的情况&…

leetcode:529. 扫雷游戏【节点分类,dfs,越界,分类判断,例题】

分析 1.八个方向找地雷 2.越界判断 3.当前是否是地雷计数1or0 4.当前节点的八个周边有几个雷 5.dfs节点&#xff0c;若越界or不是E就返回了&#xff0c;否则看地雷数&#xff1b;若没有地雷&#xff0c;则标志B&#xff0c;并dfs&#xff1b;否则标记地雷数 6.外部&#xff0c…