P1282 多米诺骨牌【dp】
P1282 多米诺骨牌
标签
推荐题目
题目描述
多米诺骨牌有上下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。
输出格式
输出文件仅一行,包含一个整数。表示求得的最小旋转次数。
输入输出样例
4
6 1
1 5
1 3
1 2
1 思路
把所有点数大的置上,对于反转过的卡牌,重量为-1,价值为 2 * (Y - X),并增加背包原始重量;未反转的,重量为1, 体积为 2 * (X-Y);
f[i][j] 表示前 i 张牌的体积为 j 的最小重量。
CODE
#include <bits/stdc++.h>
#define dbg(x) cout << #x << "=" << x << endl
#define eps 1e-8
#define pi acos(-1.0) using namespace std;
typedef long long LL; template<class T>inline void read(T &res)
{
char c;T flag=;
while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
} namespace _buff {
const size_t BUFF = << ;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
if (ib == ie) {
ib = ibuf;
ie = ibuf + fread(ibuf, , BUFF, stdin);
}
return ib == ie ? - : *ib++;
}
} int qread() {
using namespace _buff;
int ret = ;
bool pos = true;
char c = getc();
for (; (c < '' || c > '') && c != '-'; c = getc()) {
assert(~c);
}
if (c == '-') {
pos = false;
c = getc();
}
for (; c >= '' && c <= ''; c = getc()) {
ret = (ret << ) + (ret << ) + (c ^ );
}
return pos ? ret : -ret;
} int n; int f[][];
bool vis[][]; int w[];
int v[]; int main()
{
int x, y;
scanf("%d",&n);
int maxn = ;
int weight = ;
for(int i = ; i <= n; ++i) {
scanf("%d %d",&x, &y);
if(x > y) {
v[i] = * (x-y);
w[i] = ;
maxn += x-y;
}
if(y > x) {
v[i] = * (y-x);
w[i] = -;
maxn += y-x;
weight++;
}
}
for(int i = ; i <= n; ++i) {
for(int j = ; j <= maxn; ++j) {
f[i][j] = f[i-][j];
vis[i][j] = vis[i-][j];
if(vis[i-][j-v[i]] || !(j - v[i])) {
if(!vis[i][j]) {
f[i][j] = f[i-][j-v[i]] + w[i];
vis[i][j] = ;
}
else {
f[i][j] = min(f[i][j], f[i-][j-v[i]]+w[i]);
}
}
}
}
int q;
for(int i = maxn; i >= ; --i) {
if(vis[n][i]) {
q = i;
break;
}
}
printf("%d\n",weight+f[n][q]);
return ;
}
P1282 多米诺骨牌【dp】的更多相关文章
- 洛谷P1282 多米诺骨牌 (DP)
洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...
- P1282 多米诺骨牌 dp
思路:dp[i][j] 的j是上半段的和的值 这里表示的是达到上半段值是j的最小次数 答案在最小的可达到的j #include<bits/stdc++.h> using namespa ...
- Luogu P1282 多米诺骨牌 DP。。背包?
背包...差不多..QWQ 设f[i]为达到差值为i的状态需要多少次,那就很显然了: 注意区分正负不同的代价的循环方向 技巧:如果不想改负数的话,那可以移动一下数组下标,用一个新的指针指向原来的数组 ...
- P1282 多米诺骨牌
P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S ...
- 洛谷P1282 多米诺骨牌
P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S ...
- poj 1717==洛谷P1282 多米诺骨牌
Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6571 Accepted: 2178 Descript ...
- P1282 多米诺骨牌 (差值DP+背包)
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- P1282 多米诺骨牌 (背包变形问题)
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- P1282 多米诺骨牌[可行性01背包]
题目来源:洛谷 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+ ...
随机推荐
- Python 协程 - Coroutines
协程 - Coroutines Awaitable Objects, Awaitable Objects 通常由 __await__() 生成, 而 Coroutine objects 是由 asyn ...
- 浅谈Linux与unix系统的来历
在今天的UNIX是商业化的,UNIX系统大多是与硬件配套的,也就是说,大多数UNIX系统如AIX.HP-UX等是无法安装在 x86 服务器和个人计算机上的,UNIX系统是一个分时系统,而UNIX是至关 ...
- win10配置CUDA+Tensorflow2.0的一些经验
目录 问题描述 安装 tensorflow-cpu-2.0 编译 Nvidia Samples 问题描述 网上已经很多关于配置CUDA的文章,自己这篇文章只是个大致的安装步骤,文章重点是安装和配置的一 ...
- Windows渗透备忘录
Windows渗透备忘录 mimikatz mimikatz.exe ""privilege::debug"" ""sekurlsa::lo ...
- git学术
点滴是为了生活,学术是为了未来.点滴经常看,学术用到的时候看看. #### git add 之后, git reset HEAD filename 和git checkout HEAD filenam ...
- 远程连接Linux下mysql报10061
最近接到一个新活,四台Linux服务器配置MySQL热机双备+IP隧道LVS集群服务,尽管好想使个眼神杀死老大,但特么心里是感激的.不多说一口气装了n个Ubuntu-server. 每次在虚拟机装完M ...
- Java第一次代码作业汇总
练习题1:(完数问题) 求100以内的所有完数.(完数:它所有因子之和等于其本身) 方法一: /* 解体思路:1.先找出每个数的所有因子 2.比较因子之和是否与其数本身相等 */ public c ...
- Linux运维---1.Ceph分布式存储架构及工作原理
Ceph理论 Ceph 简介 Ceph 是一个开源项目,它提供软件定义的.统一的存储解决方案 .Ceph 是一个具有高性能.高度可伸缩性.可大规模扩展并且无单点故障的分布式存储系统 . Ceph 是软 ...
- Task.Run()方法总结
一.从异步方法的声明说起 无返回值的类型异步方法 (1)public async Task MethodName() 带返回值类型的异步方法 (2)public async Task<TResu ...
- Mysql:MySQL数据管理
Mysql:MySQL数据管理 外键管理 外键概念 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关 ...