【万题详解】洛谷P1282 多米诺骨牌

题目

链接——题目在这里!!!

多米诺骨牌由上下 22 个方块组成,每个方块中有 1∼6 个点。现有排成行的上方块中点数之和记为 S1​,下方块中点数之和记为 S2​,它们的差为 ∣∣S1​−S2​。如图S1=6+1+1+1=9,S2=1+5+3+2=11,|S1​−S2​∣=2。每个多米诺骨牌可以旋转 180°,使得上下两个方块互换位置。请你计算最少旋转多少次才能使多米诺骨牌上下 2行点数之差达到最小。

对于图中的例子,只要将最后一个多米诺骨牌旋转 180°,即可使上下 2行点数之差为 0。

输入格式

输入文件的第一行是一个正整数 n(1≤n≤1000),表示多米诺骨牌数。接下来的 n 行表示 n 个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数 a 和 b,且 1≤a,b≤6。

输出格式

输出文件仅一行,包含一个整数。表示求得的最小旋转次数。

输入输出样例

输入 #1

4
6 1
1 5
1 3
1 2

输出 #1

1

解题思路

题目要求的是最小差值情况下的最小交换次数,那么我们把其中一个计入状态里。记交换次数好像不太好做(我没试过),所以我们要记的是差值。

但是差值是一个绝对值,好像也不是很好表示,所以我们再来转化一下。观察到每次交换只是把上下两个数交换,故前i个骨牌上下两行数的总和是不变的,所以我们只需记录其中一行数字的和就可以知道差值了。这样状态就好表示了。

f[i][j]表示前i个数字,第一行的数字和是j时,最小的交换次数。初始值所有f[i][j]都是无穷大,f[1][a[1]]=0,f[1][b[1]]=1。(a[]和b[]分别表示第一行和第二行的数字)

转移时,枚举每一个可能的和,共有6*n个,考虑当前一个交不交换即可:

if (j-a[i] >= 0) f[i][j] = min(f[i][j], f[i-1][j-a[i]]);  //当前不交换
if (j-b[i] >= 0) f[i][j] = min(f[i][j], f[i-1][j-b[i]]+1);  //当前交换

求答案时再枚举一下前n个骨牌第一行的和就好。

这样时间、空间复杂度均为O(n*n*6)。

我们发现,每一组骨牌对答案的贡献都是独立的,所以可以单独计算。

设计状态为f[i][j],表示处理到第i个骨牌,所有上面的数减去所有下面的数的值为j的最小旋转次数。因为每一组的差值不超过5,最多有1000组骨牌,所以j的范围是-5000~5000。处理时将j都加上5000,来处理负数下标~~【本来没有考虑到这个竟然也过了...果然玄学】~~

状态转移方程为f[i][j]=min(f[i-1][j-(a[i]-b[i])],f[i-1][j-(b[i]-a[i])]+1);

即如果不旋转,第i组骨牌的结果是a[i]-b[i],所以从f[i-1][j-(a[i]-b[i])]转移过来,答案不加,如果旋转,第i组骨牌的结果是b[i]-a[i],所以从f[i-1][j-(b[i]-a[i])]转移过来,答案+1。

剩下的就是统计答案了,按绝对值从小到大找,找到第一个有解的值就是答案,即差值最小时的答案,如果正负同时成立,就取最小值

AC

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005,INF=0x3f3f3f3f;
int a[maxn], b[maxn];
int dp[maxn][10 * maxn]; 
int n;
int N = maxn * 5;
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i] >> b[i];
    }
    memset(dp,INF, sizeof(dp));
    dp[0][N] = 0;
    for(int i = 1; i <= n; i++){
        for(int j = -N; j <= N; j++){
            int dis = a[i] - b[i];
            dp[i][j + N] = min(dp[i - 1][j - dis + N], dp[i - 1][j + dis + N] + 1); 
        }
    }
    int minn;
    for(int i = 0; i <= N; i++){
        minn = min(dp[n][i + N], dp[n][-i + N]);
        if(minn != INF){
            cout << minn << endl;
            break;
        
        }
    }
    return 0;
}

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

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

相关文章

提升MySQL访问性能

1. 读写分离 设置多个从数据库&#xff0c;从数据库可能在多个机器中。写操作在主数据库进行主数据库提供数据的主要依据 缓解了MySQL的读压力。 主从复制原理图如下 如果对于读操作有一致性要求&#xff0c;那么读操作去主数据库即可。 2. 连接池 因为一个请求必须要…

SpringCloud-Nacos服务分级存储模型

Nacos 服务分级存储模型是 Nacos 存储服务注册信息和配置信息的核心模型之一。它通过将服务和配置信息按照不同级别进行存储&#xff0c;实现了信息的灵活管理和快速检索&#xff0c;为微服务架构下的服务发现和配置管理提供了高效、可靠的支持。本文将对 Nacos 服务分级存储模…

黄金交易策略(Nerve Nnife.mql4):三档移动止盈机制设计

和中国电费一样&#xff0c;一档档的上。 完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 mql4代码节选如下&#xff1a; //第一张单上涨2500&#xff0c;开始SL跟踪300点if (count 1 && !follow_p_3){double ctp calcTotalProfit(0, "b…

vue-生命周期+工程化开发(三)

生命周期 Vue 生命周期 和 生命周期的四个阶段 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;一个Vue实例从 创建…

在VSCode中创建Java项目

在VSCode中创建Java项目 首先&#xff0c;保证安装了Java的JDK. WinR -> 输入cmd -> 输入 java -version -> 然后可以看到安装的JDK版本&#xff0c;如果没安装可以去找教程。 JDK安装参考教程 打开VSCode&#xff0c;打开扩展&#xff08;Ctrl Shift S&#xff…

车载自动化项目:Python

1. 自动化测试用的什么框架&#xff1f; 第一种&#xff1a;PythonSeleniumuittest框架 首先是拿到需求文档&#xff0c;基于这个需求去进行搭建。 用pytestrequestallure 这些第三方库进行编写自动化脚本。 举个例子一般的话整个的一个自动化的搭建是分为6层嘛&#xff1a…

火车可视化调车系统

列车在调车作业时&#xff0c;当机车头在尾部推动车厢时&#xff0c;司机室一人操控机车&#xff0c;车厢前端配备两名挂梯随车运行调车员&#xff0c;调车员人为分析行车方向是否有障碍、轨道行人等紧急情况&#xff0c;通过对讲机通知司机控制停车。由于司机无法直观观察列车…

java 执行方式和类加载过程

java默认属于混合执行&#xff1a; 编译和解释并存 java先进行解释执行&#xff0c;遇到多次重复的代码会把它编程成可执行文件&#xff0c;方便下次直接执行。 可以通过VM参数来修改执行方式。 类加载过程

centos7指定目录上传到google云盘

from datetime import datetime, timedelta from concurrent.futures import ThreadPoolExecutor import os,time,subprocess,tracebackdef run_cmd(command):"""运行命令并返回输出。"""shell Trueprint(command,command)result subprocess.r…

【软件测试大作业】京东系统的Selenium自动化测试报告

1访问地址 https://wwwjd.com 2 点击左侧导航 手机/运营商/数码 2点击左侧导航"影音娱乐"的子类"蓝牙/无线耳机 4商品筛选点击查询的第一个商品(选择默认类型款式颜色)一>6.设置商品数量,点击"加入去购物车结算" Selenium测试的数据驱动设置 请结…

C#,泰波拿契数(Tribonacci Number)的算法与源代码

1 泰波拿契数&#xff08;Tribonacci Number&#xff09; 泰波拿契数&#xff08;Tribonacci Number&#xff09;是斐波那契的拓展。 泰波拿契数 (Tribonacci Number) 即把费波拿契数 (Fibonacci Number) 的概念推广至三个数。 2 计算结果 3 源程序 using System; namespace…

Linux Shell编程系列--变量的定义与使用

一、目的 上一篇我们简单介绍了shell脚本的组成以及如何运行一个shell脚本&#xff0c;本篇将详解讲解shell中的变量。在Shell脚本中&#xff0c;变量是用来存储和处理数据的基本结构。 二、介绍 1、定义变量 变量名与等号&#xff08;&#xff09;后跟值来定义一个变量&#…

antdpro框架npm install 报错,切换tyarn安装成功。

报错日志 有时间补 当前版本 解决办法 进入工作目录 安装官方推荐的tyarn工具&#xff1a;npm install yarn tyarn -g 进行依赖安装&#xff1a;tyarn 启动项目 &#xff1a;tyarn start 注意&#xff1a; 技术迭代较快&#xff0c;建议查询官网后实践&#xff0c;以上作为…

大模型实战营第二期——3. 基于 InternLM 和 LangChain 搭建你的知识库

github地址&#xff1a;InternLM/tutorial-书生浦语大模型实战营文档地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库视频地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库Intern Studio: https://studio.intern-ai.org.cn/console/instance动手学大模型…

前端面试题——JS实现反转链式表

前言 反转单向链表就是将整个单链表的数据进行倒序的过程。 例如&#xff0c;如果反转之前的单链表是0->1->2->3&#xff0c;那么反转之后的单链表应该是3->2->1->0。这个操作通常是通过改变链表中每个节点的指针方向来实现的&#xff0c;即让每个节点的指…

《Git 简易速速上手小册》第10章:未来趋势与扩展阅读(2024 最新版)

文章目录 10.1 Git 与开源社区10.1.1 基础知识讲解10.1.2 重点案例&#xff1a;Python 社区使用 Git10.1.3 拓展案例 1&#xff1a;Git 在大型开源项目中的角色10.1.4 拓展案例 2&#xff1a;支持开源项目的 Git 托管平台 10.2 新兴技术与 Git 的整合10.2.1 基础知识讲解10.2.2…

猫头虎分享已解决Bug || Go Error: Missing Return at End of Function

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【算法与数据结构】42、LeetCode接雨水

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

猫头虎分享已解决Bug || Go Error: redeclared as imported package name ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

微服务入门篇:http客户端Feign(远程调用,自定义配置,Feign的性能优化,Feign服务抽取)

目录 1.基于Feign的远程调用1.RestTemplate方式调用存在的问题2.Feign的介绍3.定义和使用Feign客户端 2.自定义配置1.方式一&#xff1a;配置文件方式2.方式二: java代码方式&#xff0c;需要先声明一个Bean: 3.Feign的性能优化1.Feign底层的客户端实现2.连接池配置 4.Feign的最…