题目链接:点击查看

题目大意:给出一个以 " 1145141919 " 无限循环的字符串,现在可以在合适的位置添加 ' + ' , ' * ' 和 ' ( ' , ' ) ' 将其转换为表达式,现在给出一个 n ,问表达出 n 所需要的最短长度是多少

题目分析:比赛时想到了可以状压 3 进制来枚举每个位置的符号:空格,+,*,然后利用递归分治暴力求解,写完之后因为复杂度不太好把控,循序渐进跑,发现当字符串长度为 10 的时候就有 4968 个数了,再想跑 n = 11 的时候就发现本地跑不出来了,硬着头皮打了个表交上去竟然 AC 了。。赛后看了一下数据,发现询问数据中最大的答案恰好就是 10 ,纯运气选手飘过

当然正解也是可以选择打表的,只不过打表程序更加优秀,其实可以直接使用递归分治再加个记忆化,对比我的程序少了个状压的过程,具体体现在了分治的过程中

然后因为有很多数会重复,所以可以用 set 去重,非常方便,dp[ l ][ r ] 为 set<int> 元素,维护了区间 [ l , r ] 内数字可以组成的答案

时间复杂度不太会算,题解说的是 11^2 * n^2 ,在本地的话反正是秒出就对了

最后对于每个答案的话,其实只有 3 和 7 是需要输出 -1 的,其余的数字都是有对应的答案的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=5e3+100;int ans[N];set<int>dp[20][20];string s=" 11451419191145141919";void dfs(int l,int r)
{if(dp[l][r].size())return;if(r-l+1<=4){int num=stoi(s.substr(l,r-l+1));if(num<=5000)dp[l][r].insert(num);}for(int i=l;i<r;i++){dfs(l,i);dfs(i+1,r);for(int x:dp[l][i])for(int y:dp[i+1][r]){if(x+y<=5000)dp[l][r].insert(x+y);if(x*y<=5000)dp[l][r].insert(x*y);}}
}void init()
{memset(ans,-1,sizeof(ans));for(int i=1;i<=11;i++){dfs(1,i);for(int x:dp[1][i])if(ans[x]==-1)ans[x]=i;}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int w;cin>>w;while(w--){int n;scanf("%d",&n);printf("%d\n",ans[n]);}return 0;
}

HDU多校6 - 6831 Fragrant numbers(dfs爆搜+打表)相关推荐

  1. 【ZSTU4210 2015年12月浙理工校赛 A】【DFS爆搜】孙壕请一盘青岛大虾呗 n个消费点m个购物点最后一位置恰好消费完

    4210: 孙壕请一盘青岛大虾呗 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 585  Solved: 249 Description 话说那一年z ...

  2. DFS(爆搜、深搜)

    DFS俗称爆搜,深搜.DFS对应的流程是一个树的结构,DFS的精髓在于递归求解的思路以及回溯的处理.针对搜索的过程,又有重要的剪枝优化.必要的剪枝优化对DFS的顺序执行有很大的作用. DFS的过程就是 ...

  3. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我参考的这篇 ...

  4. POJ3185 The Water Bowls(反转法or dfs 爆搜)

    POJ3185 The Water Bowls 题目大意: 奶牛有20只碗摆成一排,用鼻子顶某只碗的话,包括左右两只在内的一共三只碗会反向,现在给出碗的初始状态,问至少要用鼻子顶多少次才能使所有碗都朝 ...

  5. 1355. 母亲的牛奶【一般 / DFS爆搜】

    https://www.acwing.com/problem/content/1357/ #include<bits/stdc++.h> using namespace std; int ...

  6. hihocoder #1115 : 诺兹多姆(dfs爆搜)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 wuzhengkai是一个炉石传说玩家. 有一天,他碰到对面上了个诺兹多姆并上了嘲讽和圣盾. 诺兹多姆是一个有8点攻击力和8 ...

  7. HDU多校3 - 6797 Tokitsukaze and Rescue(dfs+最短路)

    题目链接:点击查看 题目大意:给出一张无向完全图,现在要求删除 k 条边,问删除后的最短路的最大值是多少,k 最大是 5 题目分析:很玄学的一道题,数据范围非常小且时间给了 8 秒,比赛时我直接暴力贪 ...

  8. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  9. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

最新文章

  1. ATS 5.3.0日志字段分析(续)
  2. Spring复习笔记:1
  3. Android TextView里直接显示图片的三种方法
  4. jQuery获取元素
  5. Java集合Collection与List的关系、常见用法
  6. bread是可数还是不可数_凡是规则,皆有例外——规则的可数名词复数,真的规则吗?...
  7. python里pip是什么意思_python使用pip的方法是什么
  8. OpenShift 4 - Fedora CoreOS (1) - 最简安装
  9. ModelSim之命令行仿真入门
  10. C-Free 5.0注册码
  11. php不改写mysql函数_利用php修改mysql数据库表前缀
  12. 【SSD目标检测】2:如何制作自己的数据集
  13. 2021 Domain Adaptation(李宏毅
  14. 这就是最适合程序员的云笔记?
  15. swiper 上滑触发_在绝地求生加入滑铲等战术动作会怎么样?你们想过吗?
  16. 给ecmall添加积分购物的功能
  17. SQL SERVER 软件和安装步骤
  18. 软件项目管理-第三章生存期模型
  19. 视频剪辑自学怎么入门?借助这款软件可以达到意想不到的效果
  20. 两个集合相等的例题_集合的相等答案

热门文章

  1. db2界面调用存储过程_第三章 操作系统用户界面
  2. dns服务器漏洞修复,KB4569509:DNS 服务器漏洞 CVE-2020-1350 指南
  3. MySQL单列索引与复合索引选择
  4. SpringBoot maxConnections、maxThreads、acceptCount解析
  5. 服务降级-多版本支持
  6. 选择器Selector
  7. 序列化技术的选型-技术层面
  8. MyBatis 解决了什么问题?
  9. Redis中的Sentinel 配置
  10. ActiveMQ入门-ActiveMQ环境搭建