算法趣题-Q37

一、问题描述

二、问题分析

        一开始,我使用了贪心的方式(也在C/C++实现中,是错的),认为短视能够获得好的结果,运行结果确实是13步最少,但是路径却不是数组路径,debug发现在0开始的贪心路径中,得到的最好结果是14,而书中0开始的最好结果为13,也就是说贪心算法至少在求局部最优时达不到效果;于是想到DP(也在C/C++实现中),但是对于DP来说,中间的计算结果不易保存,那么递归实现必然有大量的重复计算,而且DP的最终效果依旧是遍历所有排列,故最终还是选择了对所有排列的遍历(Python实现)。

三、代码实现

1.C/C++实现

#include <iostream>using namespace std;// 状态码
const int codes[10] = {0b1111110,  // 00b0110000,  // 10b1101101,  // 20b1111001,  // 30b0110011,  // 40b1011011,  // 50b1011111,  // 60b1110000,  // 70b1111111,  // 80b1111011   // 9
};
// 最大步数,用于初始化
const int MAX_STEPS_INIT = 7 * 10;// 记录状态之间的距离
int distances[10][10];// 记录已使用的标志,和顺序
int used[10];
int order[10][1 << 10];// 计算两个状态之间的变化距离
void calc_distances() {for (int i = 0; i < 10; i++) {for (int j = i; j < 10; j++) {distances[i][j] = 0;if (i != j) {int tmp = (codes[i] ^ codes[j]);while (tmp) {distances[i][j] += (tmp % 2);tmp /= 2;}distances[j][i] = distances[i][j];}}}
}// 由 cur 开始进行贪心的变换数量
int greedy(int cur) {int total = 0;for (int i = 1; i < 11; i++) {used[cur] = i;// 找下一个int next = -1, steps = 14;for (int j = 0; j < 10; j++) {if (used[j] == 0) {if (distances[cur][j] < steps) {steps = distances[cur][j];next = j;}}}if (next >= 0) {cur = next;total += steps;}}return total;
}// 由 cur 开始进行dp的变换数量
int dp(int cur, int left) {if (left == (1 << 10) - 1) {return 0;}int min_steps = MAX_STEPS_INIT;for (int i = 0; i < 10; i++) {if ((left & (1 << i)) == 0) {int tmp = distances[cur][i] + dp(i, left | (1 << i));if (tmp < min_steps) {min_steps = tmp;order[cur][left] = i;}}}return min_steps;
}int main() {calc_distances();int min_op = MAX_STEPS_INIT;int min_route[10] = { 0 };// 使用贪心法 (×)for (int i = 0; i < 10; i++) {memset(used, 0, sizeof(used));int tmp = greedy(i);if (tmp < min_op) {min_op = tmp;for (int j = 0; j < 10; j++) {min_route[used[j] - 1] = j;}}}cout << min_op << endl;for (int i = 0; i < 10; i++) {cout << min_route[i] << '\t';}cout << endl;// 使用 DPmin_op = MAX_STEPS_INIT;int min_index = 0;for (int i = 0; i < 10; i++) {int tmp = dp(i, 1 << i);if (tmp < min_op) {min_op = tmp;min_index = i;}}cout << min_op << endl;cout << min_index << '\t';int cur = min_index, left = 1 << cur;for (int i = 0; i < 9; i++) {cout << order[cur][left] << '\t';cur = order[cur][left];left |= 1 << cur;}return 0;
}

2.Python实现

# coding = utf-8from itertools import permutationsMAX_STEPS = 7 * 10CODES = [0b1111110,  # 00b0110000,  # 10b1101101,  # 20b1111001,  # 30b0110011,  # 40b1011011,  # 50b1011111,  # 60b1110000,  # 70b1111111,  # 80b1111011]  # 9distances = []def calc_distances():for i in range(10):tmp = [0] * 10for j in range(10):if i != j:tmp[j] = str(bin(CODES[i] ^ CODES[j])).count('1')distances.append(tmp)passdef calc_for_route(route):steps = 0for i in range(len(route) - 1):steps += distances[route[i]][route[i + 1]]return stepsdef get_min():calc_distances()min_steps = MAX_STEPSmin_route = ()for item in permutations(range(10)):tmp = calc_for_route(item)if min_steps > tmp:min_steps = tmpmin_route = itemreturn min_steps, min_routeif __name__ == '__main__':steps, route = get_min()print(steps, route)pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5560.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些通过数学分析解决的算法题汇总

写在前面 如果觉得写得好&#xff0c;或者有所帮助&#xff0c;记得点个关注和点个赞&#xff0c;不胜感激&#xff01; 我发现最近经常会遇到一些需要通过数学分析去解决的问题&#xff0c;做的时候想着各种方法&#xff0c;然后看到题解&#xff0c;发现可以用数学分析的方式…

演示求解中学数学题(Mathematica)

#高二解析几何题# 在[-3,4]区间上动曲线2x^24xc跟曲线1/3x^3x^2x有两个公共点,求c的取值范围. (现在高中的数学题难度已经算是高了;需要高等数学知识了) 直接求解: ClearAll["Global*"]; xmin -4; xmax 5; ymin -15; ymax 50; \ xnum 4; ynum 2; v Table[Ma…

算法-数学题

目录 50. Pow(x, n)54. 螺旋矩阵剑指 Offer 10- I. 斐波那契数列169. 多数元素剑指 Offer 39. 数组中出现次数超过一半的数字 191. 位1的个数剑指 Offer 15. 二进制中1的个数剑指 Offer 56 - I. 数组中数字出现的次数剑指 Offer 56 - II. 数组中数字出现的次数 II剑指 Offer 58…

文心一言 VS chatgpt (15)-- 算法导论3.2 4~5题

四、函数 ⌈ lg ⁡ n ⌉ ! \lceil \lg n \rceil ! ⌈lgn⌉! 多项式有界吗&#xff1f;函数 ⌈ lg ⁡ lg ⁡ n ⌉ ! \lceil \lg \lg n \rceil ! ⌈lglgn⌉! 多项式有界吗&#xff1f; 文心一言&#xff1a; chatgpt&#xff1a; 对于第一个问题&#xff0c;函数 ⌈ lg ⁡ n…

让Chatgpt帮你出Python练习题

最近发现Chatgpt有一个很棒的功能&#xff0c;感觉是让培训机构失业呀。 你可以让Chatgpt出Python练习题&#xff0c;能涵盖任意的知识点&#xff0c;对于初学者来说简直是福音。 Chatgpt在编程上面的对话能力是好于其他场景的&#xff0c;因为编程是机器语言&#xff0c;cha…

chatgpt赋能python:用Python计算数学题,速度快效果好!

用Python计算数学题&#xff0c;速度快效果好&#xff01; 在现代化的信息时代&#xff0c;计算机已经成为了我们生活中不可缺少的工具之一。而对于数学爱好者来说&#xff0c;用计算机进行数学计算已经变得非常普遍&#xff0c;因为使用计算机能够快速解决数学难题&#xff0…

MJ基础入门之注册:超详细注册 Midjourney 及使用方法

如何注册并使用 Midjourney Midjourney是一款优秀的AI图像生成工具&#xff0c;它的综合能力十分强大且易于上手。使用Midjourney&#xff0c;您可以在一分钟内生成4张图像&#xff0c;这是非常快的。不仅如此&#xff0c;国外的很多图像创作者都在使用Midjourney&#xff0c;并…

Claude的奇妙之旅:一起探索人工智能的无限可能

是一款由Anthropic公司开发的人工智能应用&#xff0c;可以在Slack中使用。可以理解和生成自然语言&#xff0c;帮助用户完成各种任务&#xff0c;如写小说、编写代码、解释概念等。的特点是&#xff1a; - 是免费的&#xff0c;不需要申请或下载&#xff0c;只需要在Slack中添…

注册claude AI账号 slack工作区账号

Claude 是建立在 slack工作区的一个AI人工助手&#xff0c;更像是将chatgpt集成到了会议模式&#xff0c;一个账号实际上拥有了你的会议室和你的AI助手&#xff0c;你可以让你的朋友和同事进入你的房间体验。 Claude是不是openai的产物&#xff1f;目前还不知道&#xff0c;不…

idea插件 Bito – GPT-4 ChatGPT AI写代码 分析代码 生成测试用例

Bito介绍 Bito官网 https://bito.ai/ Bito AI是一款通用的人工智能辅助工具&#xff0c;基于最新的ChatGPT实现&#xff0c;开发者可以提出任何技术问题&#xff0c;根据自然语言提示生成代码。 Bito AI可以用于编写代码、理解语法、编写测试用例、分析解释代码、注释代码、…

chatgpt怎么用?对新媒体作者有什么用处?

chatgpt怎么用&#xff1f;作为一名新媒体作者&#xff0c;我认为ChatGPT是一款非常有用的工具。在这篇文章中&#xff0c;我将详细介绍ChatGPT的产品介绍、用处以及能为人们带来的好处。 一.Chatgpt是什么 ChatGPT是一款基于人工智能技术的聊天机器人&#xff0c;使用了开源…

3 分钟利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信

原文链接&#xff1a;https://forum.laf.run/d/556 FastGPT 是一个超级&#x1f42e;&#x1f37a;的 ChatGPT 平台项目&#xff0c;功能非常强大&#xff1a; ✅ 集成了 ChatGPT、GPT4 和 Claude ✅ 可以使用任意文本来训练自己的知识库、文档库&#xff0c;而且知识库专有模…

亲测好用!免费英语学习版ChatGPT,国内能直接用!(内测名额有限)

ChatGPT大火几个月了 热度似乎没有减退的意思 每天见识到别人晒出最新应用截图 自己却还迟迟没有上手使用 但是&#xff0c;只要是用过它的人 都会马上承认它的魔力 聊闲天、编脚本、学面试 做总结、做翻译、写作文 只要释放几句“咒语”&#xff08;prompt&#xff09; 就能看…

chatGPT替代方案

最近chatGPT太火了&#xff0c;分享几个可用的地址 1.Edge插件Sider 打开edge外接程序界面Microsoft Edge Addons 搜索Sider ,第一个就是&#xff0c;点击获取添加到浏览器就可以使用了&#xff0c;无需魔法&#xff0c;搜索时右边栏会出现chartGPT的回答&#xff0c;非常棒 …

ChatGPT在工业领域的用法

在工业数字化时代&#xff0c;我们需要怎么样的ChatGPT&#xff1f; 近日&#xff0c;ChatGPT热度高居不下&#xff0c;强大的人机交互能力令人咋舌&#xff0c;在国内更是掀起一股讨论热潮。一时间&#xff0c;这场由ChatGPT引起的科技飓风&#xff0c;使得全球最顶尖科技力量…

ChatGPT:数字时代革新与展望

ChatGPT&#xff1a;数字时代革新与展望 AGI 未来的愿景&#xff1a;建安全有益的 AGI OpenAI团队对AGI的展望&#xff1a; 我们希望 AGI 能够赋予人类在宇宙中最大程度地繁荣发展的能力。我们不期望未来是一个不合格的乌托邦&#xff0c;但我们希望将好的最大化&#xff0c;将…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后&#xff0c;该聊天机器人被广泛谴责为一种免费的论文写作、应试工具&#xff0c;它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

让ChatGPT谈谈科技发展

ChatGPT谈科技发展 讲讲科技发展的那些事儿谈谈ChatGPT对科技发展的影响谈谈你对ChatGPT的看法ChatGPT对科技发展的负面影响ChatGPT的存在是利是弊&#xff1f;关于全国科技者工作日 讲讲科技发展的那些事儿 谈谈ChatGPT对科技发展的影响 谈谈你对ChatGPT的看法 ChatGPT对科技发…

ChatGPT的诞生和发展

ChatGPT的诞生和发展 ChatGPT是一种基于GPT模型的聊天机器人。GPT模型是一种基于深度学习的自然语言处理模型&#xff0c;由OpenAI团队开发&#xff0c;可以生成与输入文本相关的连续文本。ChatGPT的诞生和发展&#xff0c;可以追溯到GPT模型的开发与应用。 一、GPT模型的开…

大模型底层原理与引用开发范式

大模型基本原理 temperature: 随机性top_prepetition_penalty: 重复性 大模型时代以前 LLM时代的开发范式 Prompt工程 Embedding辅助 大模型微调 必备能力和工具 ChatPaper