题目描述

多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的

上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,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

Solution

此题是一道双向背包.

这道题一看,就觉得应该和背包有点关系.然后要想到背包的本质是什么.

背包的本质就是通过当前状态的前驱, 进行更新.

然后就是状态定义:

f[ i ][ j ] 表示 前 i 个组合里面 上面那个数组的和.

同时因为无论怎么变化 两个数列的总和始终是不变的.

所以之后的状态转移方程和 背包非常相似.

可以试着自己想一想.

Ps: 注意 f[1][ ] 的初始化.

代码(内有一部分注释) :

#include<bits/stdc++.h>
using namespace std;
const int maxn=1008;
const int inf=1231654;int n,a[maxn],b[maxn];int w[maxn],sum;int f[maxn][6*maxn];//状态表示 前 i 个里面上一列的值是多少.//同时因为交换不会改变两列数的总和,所以可以很方便地求出另外一列的值
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i],&b[i]);sum+=(a[i]+b[i]);}//表示 初始状态. 若第一个换就是 0 否则为1;for(int i=1;i<=n;i++)for(int j=0;j<=n*6+10;j++) f[i][j]=inf;f[1][a[1]]=0; f[1][b[1]]=1;for(int i=2;i<=n;i++)// 注意从 2 开始for(int j=0;j<=n*6;j++){if(j-a[i]>=0)f[i][j]=min(f[i][j], f[i-1][j-a[i]]);//若仍然为a 则不需要去加;if(j-b[i]>=0)f[i][j]=min(f[i][j], f[i-1][j-b[i]]+1);}int minc=inf,mint=inf;for(int i=1;i<=sum;i++){if(f[n][i]!=inf)if(abs(i-(sum-i))<minc)minc=abs(i-(sum-i)),mint=f[n][i];elseif(abs(i-(sum-i))==minc) mint=min(f[n][i],mint);}cout<<mint<<endl;return 0;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/8708825.html

P1282 多米诺骨牌 (差值DP+背包)相关推荐

  1. 洛谷P1282 多米诺骨牌 题解

    洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...

  2. 【动态规划】洛谷 P1282 多米诺骨牌

    [动态规划]洛谷 P1282 多米诺骨牌 时间限制: 1 Sec  内存限制: 128 MB 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下 ...

  3. P1282 多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  4. C++ P1282 多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  5. 【01背包】洛谷P1282多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  6. 洛谷p1282多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  7. 多米诺骨牌问题 概率DP

    题目描述 准备一个m行n列的二维多米诺骨牌进行游戏. 游戏的目标是让二维的多米诺骨牌全部倒下.一个多米诺骨牌倒下的时候,有P的概率往下一列倒,有Q的概率往下一行倒,并触碰该方向上与其相邻的骨牌. 当一 ...

  8. 洛谷 [P1282] 多米诺骨牌

    这道题是一道背包问题,考虑一个背包, 显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的. 所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是 ...

  9. P1282 多米诺骨牌题解

    [题目链接] P1282 [解题思路] 这道题我本来是想用贪心,用sort从大到小排序后,减去两张骨牌的差直到最小,结果却发现自己WA了. 很显然我的贪心是错误的,于是我后来就用了老师教的 dpdpd ...

最新文章

  1. python读取大文件-python如何读取大文件以及分析时的性能优化小技巧
  2. 计算机二级python用什么书-计算机二级 Python 怎么考?考什么?
  3. 基于XMPP协议的aSmack源码分析
  4. 【机器学习基础】逻辑回归 + GBDT模型融合实战!
  5. 笔记本电脑建wifi
  6. halcon边缘检测的方法及各种方法的适用范围
  7. 1038. 统计同成绩学生(20)
  8. 职场pua是什么意思,如何反职场pua,职场pua如何走出来
  9. 20150820-Linux命令概述及一些基本命令
  10. 如何从小白进化成 Apache Flink 技术专家?9节基础课程免费公开!
  11. Confluence 6 针对大数据量备份
  12. SQL 比较时间大小
  13. 生成解析器:Fsyacc
  14. windows虚拟显示器开发(一)
  15. 安装苹果电脑双系统 启动Windows时候鼠标键盘无反应
  16. WebService框架——CXF介绍
  17. Unity编辑器扩展——撤回
  18. 我们为何要选择使用LINUX?--大家自己体会
  19. 制作思维导图的要点总结
  20. Linux 下如何压缩/解压缩文件

热门文章

  1. ffmpeg入门及java操作ffmpeg对视频进行处理
  2. .html .php .asp,html静态页面中执行php、asp函数代码
  3. 指定jdk8_动图+源码+总结:深度解析 JDK8 中的数据结构(珍藏版)
  4. 【实验】通过IGMP实现接收组播视频信息案例
  5. 云栖第一天:解密两个100%背后的云原生
  6. 「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」
  7. 微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现
  8. linux下mysql服务架设_linux下源码搭建php环境之mysql(一)
  9. java分批查询oracle数据库_数据库的分批查询问题
  10. python的init有什么用_Python中 __init__.py的作用