UVA 529 Addition Chains

本博客探讨了一种算法,旨在通过一系列加法操作,构建从1开始的最短数列,使得数列的最后一个元素等于给定的目标数字。通过剪枝策略优化搜索过程,确保在有限时间内找到解决方案。

分析

给定一个数,尝试构造一个最短的数列,每一个数字由其之前的数字相加得,使得最后一个数字为所给数字。

每一次尝试相加其实应该是前一个值尝试加上自它向前的所有值。例如5,尝试1,2,…,下一位应该先尝试4,再尝试3。

这里注意需要剪枝!如何判断能否构造成功呢?
考虑一下上面的尝试方法,最大值是不是它的2倍呢?如果这个值在有限次数的翻倍也不能到达这个数,那么可以不用尝试了。

至于最大长度16个数,还是一个magic number(提交多次试的..当然无妨开大一些的)。

代码

#include <cstdio>
#define MAX_N 16
int n, p, a[MAX_N] = {1}, r[MAX_N];

void dfs(int t)
{
    if (t >= p) return;
    if (a[t-1] == n) {
        p = t;
        for (int i = 0; i < p; i++) r[i] = a[i];
        return;
    }

    for (int i = t-1; i >= 0; i--) {
        a[t] = a[t-1] + a[i];
        if (a[t] <= n && a[t]<<(p-t-1) >= n) dfs(t + 1);
    }
}

void solve()
{
    p = MAX_N;
    dfs(1);
    for (int i = 0; i < p; i++) {
        printf("%d", r[i]);
        if (i != p-1) printf(" ");
        else printf("\n");
    }
}

int main()
{
    while (scanf("%d", &n), n) solve();
}

题目

Description

An addition chain for n is an integer sequence <a0,a1,a2,,am> with the following four properties:

  • a0 = 1
  • am = n
  • a0< a1< a2<…< am-1< a m
  • For each k ( 1km) there exist two (not neccessarily different) integers i and j ( 0i,jk1) 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 ( 1n10000). 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
05-09
### 关于 Chains 的概述 Chains 是一种广泛应用于不同领域的重要概念,可以指代多种含义,包括但不限于数据结构、算法或框架。以下是关于 Chains 在各个方面的详细介绍。 #### 1. **链式约束(水平/垂直链条)** 在 Android 开发中,`Chains` 被用于描述组件之间的布局关系。通过右键菜单选择 `Create Horizontal Chain` 或 `Create Vertical Chain`,开发者能够轻松构建复杂的 UI 布局[^1]。这种技术允许组件之间形成紧密关联的链条,在调整单个组件位置时自动更新其他组件的位置。 #### 2. **路由链(RouterChain)** 在基于大语言模型的应用场景下,`RouterChain` 提供了一种动态决策机制。它利用 LLM 对输入 Prompt 进行分析,并根据推理结果选择合适的处理链[^2]。这一特性使得 RouterChain 成为复杂任务自动化流程的理想工具之一。 #### 3. **LangChain 中的链式结构(Chains)** 作为 LangChain 库的核心组成部分之一,“链”代表了一系列按顺序执行的任务步骤。下面给出一个简单示例: ```python from langchain.chains import SimpleSequentialChain from langchain.llms import OpenAI llm = OpenAI(temperature=0) # 定义两个连续操作 define_problem_chain = lambda input: llm(f"请为我生成一个与以下主题相关的问题: {input}") answer_question_chain = lambda input: llm(f"这个问题的答案是什么: {input}") # 构建链并运行 chain = SimpleSequentialChain(chains=[define_problem_chain, answer_question_chain]) result = chain.run("气候变化") print(result) ``` 上述代码片段展示了如何将多个逻辑单元串联起来形成完整的处理流水线[^3]。 #### 4. **Rust 编程环境下的 Chains 实现** 对于某些特定应用场合而言,采用 Rust 编写高性能软件可能是更优的选择。“chains”作为一个开源项目实例,遵循标准的 Rust 工程组织形式——其中 src/main.rs 文件充当入口点,而 Cargo.toml 则负责配置依赖项及相关参数设置[^4]。启动脚本如下所示: ```bash #!/bin/bash cargo run --bin chains --release ``` #### 5. **Daisy Chains 算法优化策略** 针对 Daisy Chains 类型问题,可以通过引入前缀和技巧降低时间复杂度至 O(n²)[^5]。核心思想在于预先计算数组各索引处累积值 si ,从而简化后续区间查询过程: \[ s_i = \sum_{k=1}^{i}{p_k} \] 在此基础上进一步推导得到任意子序列均值表达式: \[ average_{i,j}=\frac{s_j-s_i+p_i}{j-i+1} \] 最后遍历所有可能满足条件的情况完成统计计数工作即可实现高效解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值