POJ2248-Addition Chains
满足如下条件的序列被称为加成序列:
X[1]=1,X[m]=n,X[1]<X[2]<......<X[m-1]<X[n]
对于每个k(2<=k<=m)都存在两个整数i和j(1<=i,j<=k-1,i,j可以相等),使得X[k]=X[i]+X[j]。
给定一个n,找出符合上述条件的长度m最小的加成序列,多个答案输出一个即可。n<=100
搜索,对于当前位置k,可以有任意两个i,j相加得出,所以我一开始是两层循环(菜死了)然后得出k再搜索k+1。
但任意两个i,j只需要i不变,j从1到k-1枚举得出的答案就和两个i,j得出的一样。只是顺序不同,不影响两者的和。
然后加入以下剪枝:
1.优化搜索顺序:为了尽快得到n,尽量从大到小枚举
2.排除等效冗余,就是加入一个数组判重
3.迭代加深,因为长度m的值不会太大(<=10),而每次搜索每个数的和,分支很多。所以可以限制搜索深度。
4.如果当前这个数连续翻倍m-k次后还是比n小,那么就可以返回。
代码如下:
#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>
#include <cmath>
#include <string.h>
using namespace std; int n,arr[],p,vis[],ansr[],ans;
int lim;
bool flag;
int pow(int a,int b)
{
int ret=;
while(b){
if(b&)
ret=ret*a;
a=a*a;
b>>=;
}
return ret;
}
void dfs(int x)
{
if(x==lim){
if(arr[x-]==n){
flag=true; for(int i=;i<=x-;++i)
ansr[i]=arr[i];
}
return ;
}
if(flag)
return ;
if(arr[x-]*pow(,lim-x)<n)
return ;
for(int i=x-;i>=;--i){
if(vis[arr[x-]+arr[i]])
continue;
vis[arr[x-]+arr[i]]=;
arr[x]=arr[x-]+arr[i];
dfs(x+);
vis[arr[x-]+arr[i]]=;
}
}
int main() {
while(scanf("%d",&n),n){
arr[]=;
memset(vis,,sizeof vis);
memset(ansr,,sizeof ansr);
vis[]=; for(lim=;lim<=;lim++)
{
flag=false;
//memset(vis,0,sizeof vis);
//p=1;
dfs();
if(flag)
break;
}
for(int i=;i<lim-;++i)
printf("%d ",ansr[i]);
printf("%d\n",ansr[lim-]);
}
return ;
}
POJ2248-Addition Chains的更多相关文章
- [POJ2248] Addition Chains 迭代加深搜索
Addition Chains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5454 Accepted: 2923 ...
- POJ2248 Addition Chains 迭代加深
不知蓝书的标程在说什么,,,,于是自己想了一下...发现自己的代码短的一批... 限制搜索深度+枚举时从大往小枚举,以更接近n+bool判重,避免重复搜索 #include<cstdio> ...
- UVA 529 Addition Chains(迭代搜索)
Addition Chains An addition chain for n is an integer sequence with the following four propertie ...
- 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\). 数列中的一 ...
- 【POJ2248、LOJ#10021】 Addition Chains
事先预警:由于我太蒻了,本做法只能在POJ.LOJ等小数据(N<=100)平台上通过,在UVa(洛谷)上大数据并不能通过 戳我获得更好的观看效果 本题不用看,爆搜就是了,但是纯爆搜显然会爆时间, ...
- 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 ...
随机推荐
- parallel Stream 学习
首先,我们需要了解下ForkJoinPool.ForkJoin框架是从jdk7中新特性,它同ThreadPoolExecutor一样,也实现了Executor和ExecutorService接口.它使 ...
- LINUX | 谷歌云开启SSH及设置root密码
一.设置root密码 1.先选择从浏览器打开ssh连接服务器 2.切换到root账号 sudo -i 3.设置root密码 passwd 然后会要求输入新密码,然后再重复一次密码,输入密码的时候不会显 ...
- 线性筛素数和理解 洛谷P3383
题目链接:https://www.luogu.org/problemnew/show/P3383 线性筛法筛素数的特点是每一个数字只被遍历一次,即时间复杂度为O(n),所以说他是线性的,并且所有的非素 ...
- pwnable.kr-col-witeup
和上道题类似,先看看col.c代码呗. 欧克,此程序可以查看flag内容,下载下来慢慢分析. 好叭,他是要输入20个字节,然后每4个字节分块这样相加,结果和0x21DD09EC比较. 先验尝试可知,不 ...
- JSP数据库插入判断
- paloalto防火墙注册
一.创建账户 1.注册网站: https://support.paloaltonetworks.com/Support/Index 2.单击 Activate My Account 3.输入 Your ...
- spring boot整合websocket
转载自:https://www.cnblogs.com/GoodHelper/p/7078381.html 一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日 ...
- Vue的从入门到放弃
此贴仅记录vue学习路程中遇见的大大小小,形形色色的问题 1. vue自动打开浏览器配置: 当使用vue 脚手架搭建项目后启动npm run dev,会出现 但是不会自动打开浏览器的,这时候去con ...
- ERC20 token standard issues.
- 7I - 数塔
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...