码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • POJ 3134:Power Calculus ← IDA*


    【题目来源】
    http://poj.org/problem?id=3134
    https://www.luogu.com.cn/problem/UVA1374

    【问题描述】
    求最少用多少次乘法或除法,可以从x得到x^n。(每次只能从已经得到的数字里选择两个进行操作)
    例如,x^31可以通过最少6次操作得到(5次乘,1次除)
    x^2 = x*x
    x^4 = (x^2)*(x^2)
    x^8 = (x^4)*(x^4)
    x^16 = (x^8)*(x^8)
    x^32 = (x^16)*(x^16)
    x^31 = (x^32)÷x

    【算法分析】
    BFS的遍历方式是按层进行的,所以BFS具有最短路的特性,而DFS不具有最短路的特性。由此可见,能用BFS解决的问题,DFS不一定可行。

    本题Power Calculus,拟求最少次数,即求有
    最短路特性的指标,所以直觉上会选择BFS。但是,本题要求在求解x^n时,只能使用之前已经计算出的结果,但是BFS的最短路特性不能保证此结果已经算出。所以,在BFS和DFS之间做选择时,只能选择DFS来求解了。但是,本题事先无法确定搜索上界,若盲目选择DFS一搜到底的话,时间开销太大。因此,本题选择优化的DFS算法,即IDA*算法来求解。

    IDA*=IDDFS+估价函数。其中,IDDFS 是 Iterative Deepening DFS 的缩写,意思是迭代加深搜索。由名字易知,IDDFS 是一种 DFS。估价函数 h() 的作用是预测从当前深度至少经过多少步才能到达目标状态。假设当前在第cur 层,则当 cur+h(cur)>maxd 时候,就说明不论怎么走,都不可能在 maxd 的限制之内找到目标状态,此时就可以进行“剪枝”操作。
    IDA*算法的思路为:首先设定搜索深度 maxd=1,然后利用 DFS 在状态树的 maxd=1 深度之内进行搜索。如果没有找到解,就以搜索深度 maxd=2 进行搜索,……,直到成功找到解为止。其相应的标志性代码为:
    while(!dfs(maxd)) maxd++;

    【算法代码】

    1. #include
    2. using namespace std;
    3. const int maxn=1005;
    4. int a[maxn];
    5. int maxd,n;
    6. bool IDA(int pos) {
    7. if(pos>maxd) return 0; //IDDFS
    8. if(a[pos]==n) return 1;
    9. if(a[pos]<<(maxd-pos)return 0; //Pruning operation
    10. for(int i=0; i<=pos; i++) {
    11. a[pos+1]=a[pos]+a[i]; //add operation
    12. if(IDA(pos+1)) return 1;
    13. a[pos+1]=abs(a[pos]-a[i]); //subtract operation
    14. if(IDA(pos+1)) return 1;
    15. }
    16. return 0;
    17. }
    18. int main() {
    19. while(cin>>n) {
    20. if(n==0) break;
    21. a[0]=1;
    22. maxd=0;
    23. while(!IDA(0)) maxd++;
    24. printf("%d\n",maxd);
    25. }
    26. return 0;
    27. }
    28. /*
    29. in:
    30. 1
    31. 31
    32. 70
    33. 91
    34. 473
    35. 512
    36. 811
    37. 953
    38. 0
    39. out:
    40. 0
    41. 6
    42. 8
    43. 9
    44. 11
    45. 9
    46. 13
    47. 12
    48. */


    【参考文献】
    https://www.it610.com/article/4188067.htm
    https://blog.csdn.net/qq_51392086/article/details/119426634




     

  • 相关阅读:
    python --- 蓝桥杯
    strimzi实战之二:部署和消息功能初体验
    ssm毕设项目薪酬管理系统b26z4(java+VUE+Mybatis+Maven+Mysql+sprnig)
    【LeetCode】每日一题:相交链表
    jingxiang制作
    Unity中SmoothStep介绍和应用: 溶解特效优化
    JDSU故障测试仪维修OTDR光时域反射仪维修MTS2000
    Java-IO流之字节输入流(中篇)
    C#的LINQ to XML 类中使用最多的三个类:XElement、XAttribute 和 XDocument
    Tengine 边缘AI计算框架移植RV1126(包括opencv的交叉编译)
  • 原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/126552193
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号