UVA529 Addition Chains

题意:

一个与 nn 有关的整数加成序列 $<a_0,a_1,a_2,...,a_m>$ 满足以下四个条件:
1.$a_0=1$

2.$a_m=n$
3.$a_0<a_1<a_2<...<a_{m-1}<a_m$
4. 对于每一个 k(1≤k≤m) 都存在有两个整数 i 和 j(0≤i,j≤k-1,i和 j 可以相等 ) ,使得 $a_k=a_i+a_j$?
你的任务是:给定一个整数 nn ,找出符合上述四个条件的长度最小的整数加成序列。

如果有多个满足要求的答案,只需要输出任意一个解即可。
举个例子,序列<1,2,3,5> 和 <1,2,4,5> 均为 n=5 时的解。

一看就是搜索,于是爆搜。。。

然而,这是个迭代加深搜索。。。

剪枝如下:

1.优化搜索顺序
显然倒序枚举更有可能得到可行解。

让数大一些,尽可能接近n;

2.排除不可行解
我们发现,对于加成数列的要求还有一个,即 $a_m=n$

假设当前已经通过枚举得出了 $a_i$ ,正准备搜索第 i+1 个数。

考虑通过当前形势下到第 m 项可以得到的最大值,显然,$max(a_{i+1})=a_i+a_i=2×a_i$?

$max(a_{i+2})=a_{i+1}+a_{i+1}=2×a_{i+1}=4×a_i=2^2×a_i$?

故由递推可得

$max(a_m)=2^{m-i}×a_i$?

所以在进行对 i+1 个数的搜索前,计算一下 $max(a_m)$ 是否可以达到 n ,

如果达不到则无需进行下一步的搜索。

#include<cstdio>
#include<iostream>
using namespace std;
#define love_nmr 0
int n;
bool flag;
int ans[10050];
int maxx;
inline void print()
{
    for(int i=1;i<maxx;i++)
        printf("%d ",ans[i]);
    printf("%d\n",ans[maxx]);
}
inline void dfs(int depth,int pos)
{
    if(depth==maxx+1)
    {
        if(ans[maxx]==n)
            flag=true;
        return;
    }
    for(int i=depth-1;i>=pos;i--)
    {
        for(int j=i;j>=1;j--)
        {
           int f=ans[depth]=ans[i]+ans[j];
           for(int is=pos+1;is<=maxx;is++) f<<=1;
           if(f<n)break;
           dfs(depth+1,i+1);
           if(flag)return;
           ans[depth]=0;
        }
    }
}
int main()
{
    while(~scanf("%d",&n)&&n)
    {
        if(n==1)
        {
            printf("1\n");
            continue;
        }
        flag=false;
        ans[1]=1;
        for(int i=2;i<=n;i++)
        {
            maxx=i;
            dfs(2,1);
            if(flag)
            {
                print();
                break;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/olinr/p/9429690.html

时间: 2024-11-11 21:23:57

UVA529 Addition Chains的相关文章

POJ2248 Addition Chains

Addition Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5273   Accepted: 2833   Special Judge Description An addition chain for n is an integer sequence with the following four properties: a0 = 1 am = n a0 < a1 < a2 < ... <

poj2248 Addition Chains 迭代加深搜索

Addition Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5454   Accepted: 2923   Special Judge Description An addition chain for n is an integer sequence <a0, a1,a2,...,am="">with the following four properties: a0 = 1 a

POJ 2248 Addition Chains dfs(水)

题意:给出n 构成出满足下列条件 长度最小的数列a[0]=1,a[m]=n, a[0]<a[1]<..<a[m]每个下标k都存在(i,j<k) 满足:a[k]=a[i]+a[j] n<=100 枚举长度 dfs爆搜+剪枝 水过, #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N=2e5+20; int n,a[N

ZOJ1937:Addition Chains——题解

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1937 题目大意:创造一个数列,使得它: 1.单调不递减. 2.其中一个元素一定存在其前面两个元素之和与它相等. 3.开头为1,结尾为n. 求一个这样的最短数列. —————————————————————————————————— IDA*一定的(n<=100) 对于IDA*是什么不了解的,可以看我的置顶骑士精神那道题. 我们的估价函数就是当前的值翻多少次二倍后能得到n.

POJ 2245 Addition Chains(算竞进阶习题)

迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以可以去重(记得回溯) #include <iostream> #include <cstring> #include <cstdio> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; inl

C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains

此题不难,主要思路便是IDDFS(迭代加深搜索),关键在于优化. 一个IDDFS的简单介绍,没有了解的同学可以看看: https://www.cnblogs.com/MisakaMKT/articles/10767945.html 我们可以这么想,设当前规定长度为M,题目要求得出的数为N. 在搜索中,当前的步数为step,当前的数列为 数组a. 首先来确定思路,便是在以得出的数列a中枚举每两个数相加得出sum,然后继续搜索下一步. 初步的代码便是: void iddfs(int x) { for

POJ2248 Addition Chains 迭代加深

不知蓝书的标程在说什么,,,,于是自己想了一下...发现自己的代码短的一批... 限制搜索深度+枚举时从大往小枚举,以更接近n+bool判重,避免重复搜索 #include<cstdio> #include<iostream> #include<cstring> #define R register int using namespace std; inline int g() { R ret=0; register char ch; while(!isdigit(ch

Addition Chains

POJ n<=100 洛咕 n<=10000 题意:满足如下条件的序列a被称为"加成序列": \(1.a_1=1\) \(2.a_m=n\) \(3.a_1<a_2<...<a_{m-1}<a_m\) \(4.\)对于每一个\(k(1≤k≤m)\)都存在有两个整数 \(i\) 和 \(j(1≤i,j≤k-1,i\) 和 \(j\) 可以相等 ) ,使得 \(a_k=a_i+a_j\) 你的任务是:给定一个整数 \(n\) ,找出符合上述四个条件的长度

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes