Dominoes
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 6571   Accepted: 2178

Description

A domino is a flat, thumbsized tile, the face of which is divided into two squares, each left blank or bearing from one to six dots. There is a row of dominoes laid out on a table:

The number of dots in the top
line is 6+1+1+1=9 and the number of dots in the bottom line is 1+5+3+2=11. The
gap between the top line and the bottom line is 2. The gap is the absolute value
of difference between two sums.

Each domino can be turned by 180 degrees
keeping its face always upwards.

What is the smallest number of turns
needed to minimise the gap between the top line and the bottom line?

For
the figure above it is sufficient to turn the last domino in the row in order to
decrease the gap to 0. In this case the answer is 1.
Write a program that:
computes the smallest number of turns needed to minimise the gap between the top
line and the bottom line.

Input

The first line of the input contains an integer n, 1
<= n <= 1000. This is the number of dominoes laid out on the table.

Each of the next n lines contains two integers a, b separated by a
single space, 0 <= a, b <= 6. The integers a and b written in the line i +
1 of the input file, 1 <= i <= 1000, are the numbers of dots on the i-th
domino in the row, respectively, in the top line and in the bottom one.

Output

Output the smallest number of turns needed to minimise
the gap between the top line and the bottom line.

Sample Input

4
6 1
1 5
1 3
1 2

Sample Output

1

Source

P1282 多米诺骨牌

  • 题目提供者该用户不存在
  • 标签动态规划
  • 难度提高+/省选-
  • 通过/提交316/1095

提交该题 讨论 题解 记录

题目描述

多米诺骨牌有上下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

风格1:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int const N=;
int const inf=0x3f3f3f3f;
int a[N],b[N],n;
int f[N][N**];//表示差值+p为j时的最小次数
int main(){
memset(f,0x3f,sizeof(f));
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",a+i,b+i);
int v=n**;
int p=n*;
f[][p]=;
//以下部分是两种不同的区间平移 其实第二种看起来更清晰 而且第一种会出现下标越界的情况 但是不知道为何竟然A了
for(int i=;i<=n;i++){
for(int j=;j<=v;j++){
f[i][j]=min(f[i-][j-(a[i]-b[i])],f[i-][j-(b[i]-a[i])]+);
}
}
for(int i=;i<=n;i++){
for(int j=-p;j<=p;j++){
f[i][j+p]=min(f[i-][j+a[i]-b[i]+p],f[i-][j+b[i]-a[i]+p]+);
}
}
//
for(int i=;i<=p;i++){
if(min(f[n][p+i],f[n][p-i])!=inf){
printf("%d\n",min(f[n][p+i],f[n][p-i]));
return ;
}
}
}

风格2:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ref(i,x,y)for(register int i=x;i<=y;i++)
#define def(i,x,y)for(register int i=x;i>=y;i--)
#define Q 2000
int a,b,n,nn,w[];
int f[][];
void first(){
scanf("%d",&n);
ref(i,,n) scanf("%d%d",&a,&b),w[i]=a-b;
}
void go(){
nn=*n;
memset(f,,sizeof(f));
f[][w[]+nn]=;
f[][-w[]+nn]=;
ref(i,,n) def(j,*n,){
if(j+w[i]>=&&j+w[i]<=*n)
f[i][j]=min(f[i][j],f[i-][j+w[i]]+);
if(j-w[i]>=&&j-w[i]<=*n)
f[i][j]=min(f[i][j],f[i-][j-w[i]]);
}
if(f[n][*n]<Q) {printf("%d\n",f[n][*n]);return;}
else{
for(int i=nn-,j=nn+;i>=&&j<=*nn;i--,j++){
if(f[n][i]<Q||f[n][j]<Q){
printf("%d\n",min(f[n][i],f[n][j]));
return;
}
}
}
}
int main(){
first();
go();
return ;
}

 

poj 1717==洛谷P1282 多米诺骨牌的更多相关文章

  1. 洛谷P1282 多米诺骨牌 (DP)

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

  2. 洛谷P1282 多米诺骨牌

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

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

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

  4. 洛谷 P1282 多米诺骨牌 ( 线性DP )

    题意 : 题目链接 分析 :  一开始这个想法也有想到,但是貌似要开很大数组,就感觉应该不行 遂放弃想其他方法,万万没想到注意到可以滚动优化(其实不优化也可以过) 定义 dp[i][j] 表示 到第 ...

  5. 洛谷P1282 多米诺骨牌【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1282 题意: 给定n个牌,每个牌有一个上点数和下点数.可以通过旋转改变交换上下点数. 问使得上点数之和和下点数之 ...

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

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

  7. 洛谷 P1282 多米诺骨牌("01"背包)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://blog.csdn.net/Darost/artic ...

  8. yzoj P2043 & 洛谷 P1282 多米诺骨牌 题解

    题意 类似于就是背包. 解析 代码 跟解析有点不一样v[i]价值,w[i]重量,s背包容积,背包转移即可. #include<bits/stdc++.h> using namespace ...

  9. P1282 多米诺骨牌【dp】

    P1282 多米诺骨牌 提交 20.02k 通过 6.30k 时间限制 1.00s 内存限制 125.00MB 题目提供者洛谷 难度提高+/省选- 历史分数100 提交记录 查看题解 标签   查看算 ...

随机推荐

  1. [HTML5] Render Hello World Text with Custom Elements

    Custom elements are fun technology. In this video, you will learn how to set one up and running in l ...

  2. Linux学习笔记 (四)归档和压缩

    一.zip压缩命令: 1.压缩文件: 格式:zip 压缩文件 源文件 例:zip abc.zip abc  //将abc文件压缩到abc.zip文件内. 2.压缩目录: 格式:zip –r 压缩目录 ...

  3. B6:命令模式 Command

    将一个请求封装成一个对象,从而可以用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 与状态模式和责任链模式的区别是,命令模式设定一次,统一执行 使用场景:1.可设计一 ...

  4. Python基础之字符串的练习

    练习1 #!/usr/bin/python -tt # Copyright 2010 Google Inc. # Licensed under the Apache License, Version ...

  5. OpenGL基础图形编程(八)变换

    八.OpenGL变换 OpenGL变换是本篇的重点内容,它包含计算机图形学中最主要的三维变换,即几何变换.投影变换.裁剪变换.视口变换,以及针对OpenGL的特殊变换概念理解和使用方法,如相机模拟.矩 ...

  6. 自己动手制作更好用的markdown编辑器-03

    这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/24/hexomd-03/ 文章目录 1. 系统模块 2. 记录上次打开的 ...

  7. in App Purchases一个注意事项

    在completeTransaction中通过transaction.originalTransaction.payment.productIdentifier得到的productIdentifier ...

  8. C语言基础(12)-输入和输出

    1. int scanf(const char *format, ...) 说明:scanf用于通过控制台输入字符串. 注意: (1).通过scanf()函数输入的字符串,系统会自动在其后面补一个0, ...

  9. jquery的post()

    jQuery ajax - post() 方法 jQuery Ajax 参考手册 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY ...

  10. Google Pagespeed,自动压缩优化JS/CSS/Image

    Google Pagespeed,自动压缩优化JS/CSS/Image 浏览: 发布日期:// 分类:技术分享 关键字: Nginx Appache Pagespeed 自动压缩优化JS/CSS/Im ...