用动态规划算法均分纸牌,谈谈理解思路

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  用动态规划算法均分纸牌。有n堆卡片,每堆卡片的张数不同,总的张数不一定是n的倍数。在任意两堆卡片之间,移动任意张卡片,最终目标是让最多一堆的卡片张数与最少一堆的卡片张数的差小于等于1。规定将第i堆上的一张卡片移动到第j堆上,或者相反移动,代价均为|i-j|。用动态规划算法计算均分纸牌的代价。例如当n=5,每堆张数分别是5,9,2,12,9时,最小移动代价是8。代码如下
请问:
1.解释dp[i][j]的含义
2.如何理解代码中A、B行的状态转移方程
3.题目中从第i堆移动一张卡片到第j堆上,或者相反移动,代价均为|i-j|,在程序中是如何计算|i-j|的

部分代码如下:

const int M=10;
long dp[M][M],card[M],s[M];
int main(){
    int n,i,j;
    cin>>n;
    for (i=1;i<=n;i++){
        cin>>card[i];
        s[i]=s[i-1]+card[i];
    }
    int r=s[n]%n,q=s[n]/n;
    for(i=1;i<=n;++i){ 
        for(j=0;j<=r;++j){ 
            int c=abs(s[i]-q*i-j);
            dp[i][j]=dp[i-1][j]+c;//A
            if(j)
                dp[i][j]=min(dp[i-1][j-1]+c,dp[i][j]);//B
        }
    }
    cout<<dp[n][r]<<endl;
    return 0;
}

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  这个问题是一个典型的动态规划问题,目标是最小化移动卡片的代价,使得每堆卡片的数量尽可能接近平均数。

  1. dp[i][j]的含义
    dp[i][j]表示在考虑了前i堆卡片,且这i堆卡片的总张数对n取余为j时的最小代价。这里i的范围是1nj的范围是0s[n] % n(即总张数对n的余数)。

  2. 状态转移方程的理解

    • A行dp[i][j] = dp[i-1][j] + c;
      这行代码表示考虑第i堆卡片时,如果在前i-1堆的基础上,当前的余数j不需要改变,那么代价就是前i-1堆的最小代价加上当前堆与平均值的差的绝对值c
    • B行if(j) dp[i][j] = min(dp[i-1][j-1] + c, dp[i][j]);
      这行代码是在当前余数j不为0的情况下,尝试将一张卡片从第i堆移动到其他堆,使得余数减少1(即考虑将卡片从一个较大堆移动到一个较小堆)。这里取dp[i-1][j-1] + c和已有的dp[i][j]的最小值作为新的状态值。
  3. 计算|i-j|的代价
    在题目中,移动卡片的代价是|i-j|。但在程序中,实际上计算的是卡片数量与平均值的差的绝对值c,这与|i-j|是等价的,因为题目中的移动代价定义实际上是基于卡片数量的差值,而不是物理位置的差值。在程序中,c = abs(s[i] - q * i - j);这行代码计算的就是第i堆卡片数量与平均值q的差距,如果差距是正数,表示该堆卡片多,需要移动一些卡片到其他堆;如果是负数,表示该堆卡片少,需要从其他堆移动一些卡片过来。

  总结来说,这个问题的动态规划算法通过考虑所有可能的卡片分布状态,以及在这些状态下移动卡片的代价,来找到最终的最小代价。代码中的dp数组存储了所有子问题的解,通过状态转移方程来更新最终的解。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

升级自动交易!打通miniQMT接口!股票量化分析工具QTYX-V2.8.7

前言 我们的股票量化系统QTYX在实战中不断迭代升级!!! 我们用Python搭建自己的量化交易系统&#xff0c;之前主要以手动交易或者是easytrader库为主&#xff0c;属于曲线救国的方案。 在大家的强烈推荐下&#xff0c;我们决定使用正规的量化交易平台作为下单的最后环节——QMT&…

【Visual Studio】Visual Studio使用技巧及报错解决合集

目录 目录 一.概述 二.Visual Studio报错问题及解决方法 三.Visual Studio操作过程中遇到的问题及解决方法 四.Visual Studio编译优化选项 五.Visual Studio快捷键 一.概述 持续更新Visual Studio报错及解决方法&#xff0c;包括Visual Studio报错问题及解决方法、Visua…

mac安装win10到外接固态硬盘

1、制作win10系统 1.1 下载 winToUSB&#xff0c;打开后选择第一个 1.2 选择本地下载镜像&#xff0c; 我用的分区方案是适用于UEFI的GPT模式 1.3 点右下角执行&#xff0c;等待执行完成即可 2、mac系统下载win驱动 2.1 comman空格 搜索启动转换助理&#xff0c;打开后选择…

Ubuntu 22.04.4 LTS (linux) 安装certbot 免费ssl证书申请 letsencrypt

1 安装certbot sudo apt update sudo apt-get install certbot 2 申请letsencrypt证书 sudo certbot certonly --webroot -w 网站目录 -d daloradius.域名.com 3 修改nginx 配置ssl 证书 # 配置服务器证书 ssl_certificate /etc/letsencrypt/live/daloradius.域名.com/f…

浅谈后置处理器之正则表达式提取器

浅谈后置处理器之正则表达式提取器 JMeter是一款功能强大的开源负载测试工具&#xff0c;广泛应用于Web应用、数据库等的性能测试。在进行接口测试或负载测试时&#xff0c;经常需要从服务器响应中提取某些数据作为后续请求的参数。这时&#xff0c;“正则表达式提取器”&…

Web开发:<br>标签的作用

br作用 介绍基本用法常见用途注意事项使用CSS替代 介绍 在Web开发中&#xff0c;<br> 标签是一个用于插入换行符的HTML标签。它是“break”的缩写&#xff0c;常用于需要在文本中强制换行的地方。<br> 标签是一个空标签&#xff0c;这意味着它没有结束标签。 基本…

HTML+CSS+JS用户管理(可储存用户数据)

使用cookies记录账号密码信息&#xff0c;可以注册、登录、注销账号。 点赞❤️收藏⭐️关注&#x1f60d; 效果图 源代码在效果图后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <…

无人机图像目标检测

本仓库是人工智能课程的课程作业仓库&#xff0c;主要是完成无人机图像目标检测的任务&#xff0c;我们对visdrone数据集进行了处理&#xff0c;在yolo和ssd两种框架下进行了训练和测试&#xff0c;并编写demo用于实时的无人机图像目标检测。 requirements依赖&#xff1a; ss…

OpenGL笔记一之基础窗体搭建以及事件响应

OpenGL笔记一之基础窗体搭建以及事件响应 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记一之基础窗体搭建以及事件响应1.运行2.目录结构3.main.cpp4.CMakeList.txt 1.运行 2.目录结构 01_GLFW_WINDOW/ ├── CMakeLists.txt ├── glad.c ├── ma…

效能工具:执行 npm start 可直接切换proxy代理UR后直接启动项目

1) 背景: 我们项目是2个前端3个后端的配置。前端和每个后端都有需要调试的接口。 因此经常切换vite.congig.js中的proxy后端代理链接&#xff0c;是挺麻烦的。 于是我研究如何能快速切换后端URL&#xff0c;所幸懒人有懒福&#xff0c;我找到了Inquirer 和 fs&#xff0c; 实…

MySQL NaviCat 安装及配置教程(Windows)【安装】

文章目录 一、 MySQL 下载1. 官网下载2. 其它渠道 二、 MySQL 安装三、 MySQL 验证及配置四、 NaviCat 下载1. 官网下载2. 其它渠道 五、 NaviCat 安装六、 NaviCat 激活 软件 / 环境安装及配置目录 一、 MySQL 下载 1. 官网下载 安装地址&#xff1a;https://www.mysql.com/…

人员定位管理系统有怎样优势?这4点不可忽视

众所周知&#xff0c;人员定位管理系统是通过物联网和云计算等技术&#xff0c;记录所有员工的基本信息&#xff0c;将员工位置、工作情况、运动轨迹等信息上传给系统&#xff0c;全面记录和直观的展现厂区内所有工作人员的具体情况。 除了能够查看人员位置情况外&#xff0c;人…

【C++题解】1168. 歌唱比赛评分

问题&#xff1a;1168. 歌唱比赛评分 类型&#xff1a;数组找数 题目描述&#xff1a; 四&#xff08;1&#xff09; 班要举行一次歌唱比赛&#xff0c;以选拔更好的苗子参加校的歌唱比赛。评分办法如下&#xff1a;设 N 个评委&#xff0c;打 N 个分数&#xff08; 0≤每个分…

分手后失眠之夜:如何安放那颗无处安放的心

在人生的旅途中&#xff0c;我们总会遇到一些人&#xff0c;他们像流星般划过天际&#xff0c;给我们带来瞬间的绚烂&#xff0c;却也留下了长久的寂寥。当感情走到尽头&#xff0c;分手成为无法回避的现实&#xff0c;你是否也曾躺在床上&#xff0c;辗转反侧&#xff0c;难以…

实战篇(九):解锁3D魔方的秘密:用Processing编程实现交互式魔方

解锁3D魔方的秘密:用Processing编程实现交互式魔方 使用 Processing 创建一个 3D 魔方效果展示1. 安装 Processing2. 项目结构3. 代码实现4. 代码解释4.1. 初始化魔方4.2. 绘制魔方4.3. 处理鼠标事件4.4. 检查点击的面4.5. 旋转面和最终确定旋转5. 运行和测试6. 细节解释6.1. …

等级保护测评(三级)主机linux测评指导书

等级保护测评指导书分技术&#xff08;物理安全、主机安全、网络安全、应用安全、数据安全&#xff09; 和管理&#xff08;安全管理制度、安全管理机构、人员安全管理、系统建设管理、系统运维管理&#xff09;两大块。 今天给大家分享一下&#xff0c;等级保护测评&#xff0…

Python数据可视化库之bashplotlib使用详解

概要 在数据分析和科学计算领域,数据可视化是一个不可或缺的环节。传统的图形化数据可视化工具如 Matplotlib、Seaborn 等,虽然功能强大,但有时在命令行环境下使用并不方便。Bashplotlib 是一个轻量级的 Python 库,旨在简化命令行环境下的数据可视化操作。它允许用户在命令…

TS 入门(三):Typescript函数与对象类型

目录 前言回顾1. 函数类型a. 基本函数类型b. 可选参数和默认参数c. 剩余参数 2. 对象类型a. 基本对象类型b. 可选属性和只读属性 3. 类型别名和接口a. 类型别名b. 接口扩展 4. 类型推断和上下文类型a. 类型推断b. 上下文类型 扩展知识点&#xff1a;函数重载结语 前言 在前两章…

Floyd算法——AcWing 343. 排序

目录 Floyd算法 定义 运用情况 注意事项 解题思路 基本步骤 AcWing 343. 排序 题目描述 运行代码 代码思路 改进思路 Floyd算法 定义 Floyd算法&#xff0c;全称Floyd-Warshall算法&#xff0c;是一种用于解决图中所有顶点对之间的最短路径问题的动态规划算法。…

【Memcached】Memcached的工作原理

目录 ​编辑 第2章&#xff1a;Memcached工作原理 2.1 数据存储与访问 2.2 分布式架构 2.3 数据过期机制 第2章&#xff1a;Memcached工作原理 2.1 数据存储与访问 Memcached是一种键值存储系统&#xff0c;其中数据以键值对的形式存储。键是用于定位数据的唯一标识符&am…