Addition Chains
题目描述:
一个与 n 有关的整数加成序列 < a0 , a1 , a2 ...am> 满足一下四个条件:
1.a0=1
2.am=n
3.a0<a1<a2<...<am
4.对于每个( 1≤k≤m )都存在有两个整数 i 和 j (0 ≤ i , j ≤ k - 1 , i 和 j可以相等),使得ak=ai+aj
你的任务是:给定一个整数 n ,找出符合上述四个条件的长度最小的整数加成序列。如果有多个满足要求的答案,只需要输出任意一个解即可。
举个例子:序列< 1,2,3,5 >和< 1,2,4,5 >均为 n = 5 时的解
输入格式:
多组数据,每行给定一个正整数n。输入以0结束。
输出格式:
对于每组数据,输出满足条件的长度最小的数列。
样例输入:
5
7
12
15
77
0
样例输出:
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
思路:
看了书之后才知道这题是用搜索。(蒟蒻的我只会暴力枚举)
那么怎么搜索又成为了一个问题——其实可以依次搜索一位k, 枚举之前的i, j, 把a[i] + a[j] 加到a[k]的位置上, 然后接着搜索;
这样还是AC不了。
这时就需要考虑剪枝。
对于剪枝:
①尽量从达到小枚举i,j让序列的数尽快逼近n;(贪心思想)
②为了不重复搜索,用一个bool数组存a[i] + a[j] 是否已经被搜过;
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<stack>
#include<queue>
#include<deque>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define maxn 1100
int n,ans,a[maxn];
bool use[maxn];
inline int read()
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
inline bool dfs(int stp)
{
memset(use,,sizeof(use));
if(stp>ans)
{
if(a[ans]==n) return true;
else return false;
}
for(register int i=stp-;i>=;i--)
{
for(register int j=i;j>=;j--)
{
if(a[i]+a[j]>n) continue;
if(!use[a[i]+a[j]])
{
if(a[i]+a[j]<=a[stp-]) return false;
use[a[i]+a[j]]=true;
a[stp]=a[i]+a[j];
if(dfs(stp+)) return true;
a[stp]=;
use[a[i]+a[j]]=false;
}
}
}
}
int main()
{
while(n=read(),n!=EOF)
{
if(n==) return ;
if(n==)
{
printf("1\n");
continue;
}
if(n==)
{
printf("1 2\n");
continue;
}//特判一下上述三种情况
a[]=;a[]=;
for(ans=;!dfs();ans++);//搜索记录
for(register int i=;i<=ans;i++)
{
printf("%d ",a[i]);
}
printf("\n");
memset(a,,sizeof(a));
}
return ;
}
洛谷谜一般的评测TLE,在POJ上提交AC了。
Addition Chains的更多相关文章
- UVA 529 Addition Chains(迭代搜索)
Addition Chains An addition chain for n is an integer sequence with the following four propertie ...
- [POJ2248] Addition Chains 迭代加深搜索
Addition Chains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5454 Accepted: 2923 ...
- 1443:【例题4】Addition Chains
1443:[例题4]Addition Chains 题解 注释在代码里 注意优化搜索顺序以及最优化剪枝 代码 #include<iostream> #include<cstdio&g ...
- poj 2248 Addition Chains (迭代加深搜索)
[题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...
- 「一本通 1.3 例 4」Addition Chains
Addition Chains 题面 对于一个数列 \(a_1,a_2 \dots a_{m-1},a_m\) 且 \(a_1<a_2 \dots a_{m-1}<a_m\). 数列中的一 ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- [POJ 2248]Addition Chains
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)
An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...
- C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains
此题不难,主要思路便是IDDFS(迭代加深搜索),关键在于优化. 一个IDDFS的简单介绍,没有了解的同学可以看看: https://www.cnblogs.com/MisakaMKT/article ...
- POJ 2245 Addition Chains(算竞进阶习题)
迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以 ...
随机推荐
- Ubuntu 为 root 帐号开启 SSH 登录
1. 修改 root 密码sudo passwd root 2. 以其他账户登录,通过 sudo nano 修改 /etc/ssh/sshd_config :xxx@ubuntu:~$ su - ro ...
- docker local registry server gave HTTP response to HTTPS client
server gave HTTP response to HTTPS client报错是在insecure_registry中加入了http前缀,如果本地registry不是https的 就不要加任何 ...
- ogg 12.3 中 format release的变化
Non-CDB databases with compatibility set to 12.1, FORMAT RELEASE 12.2 or above is supported. Non-CDB ...
- self: 限制并发量asyncio
#coding:utf-8 import time,asyncio a=time.time() id=1 async def hello(id,semaphore): async with semap ...
- 您的windows许可证即将过期 win10的解决办法
出现这个错误是因为安装的版本不是正版系统,每隔一段时间需要激活 这次激活也费了一些时间,记录如下希望能对大家有所帮助 (1)首先可以查看自己的许可什么什么时候会过期 windows+R调出命令运行窗口 ...
- Cannot resolve reference to bean 'sqlSessionFactory' while setting bean
今天下载公司以前的一个项目,要和现在的项目进行整合,下载一切顺利,但在开发机器上一跑,憋了. 有两种日志,两种报错:一个是cannot resolve reference to bean 'sqlSe ...
- Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏
Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏 云收藏项目已经开源3年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时 ...
- NPM安装步骤
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- linux有趣的命令screen
screen类似一个容器, 可以把当前前台运行的应用shell窗口关闭而不影响运行, 跟后后nohup有点相似, 不过我觉得比nohup还好用 用法1: screen 然后会弹出一个新的shell窗口 ...
- python简说(二十二)写日志
分四个级别 import nnloglog = nnlog.Logger('book_server.log') log.debug('xxx值是什么')log.info('调用了什么xxx')log. ...