#\(\color{red}{\mathcal{Description}}\)

\(Link\)

我们有一堆多米诺骨牌,上下两个部分都有点数,\(But\)我们有一个操作是可以对调上下的点数。若记一块骨牌\(i\)的上点数为\({S_{i,1}}\),下点数为\({S_{i,2}}\)求在达到$$\sum_{i=1}^{n}{|S_{i,1}-S_{i,12}|}$$最小时的最小操作次数。

#\(\color{red}{\mathcal{Solution}}\)

这个题在我看到其前面一半时,甚至已经把状态】给想好了:


嗯,这个题接下来的题面一定是这样的:一共最多\(m\)次操作的机会,可以用或不用,求这个多米诺骨牌序列最大\小的\(bulabulabula....\)

那么我们不妨令\(dp_{i,j,0/1}\)表示前\(i\)个骨牌,一共操作了\(j\)次,当前不操作/操作的\(bulabulabula....\)

嗯,生活就是这样充满机遇与挑战


那么记下来我们来看看这道题可以咋做,因为要求的是操作次数,所以我们不应该把操作次数计入状态,那么与操作次数有关系的是差值,看一下数据,差值最大是\(5 \times 1000\)……好像完全可以接受的样子,那么我们不妨令\(dp_{i,j}\)表示前\(i\)个多米诺骨牌,差值为\(j\)的最小步数。转移就是$$dp_{i,j} = min{dp_{i-1,j+S1-S2}, dp_{i-1,j-S1+S2}+1 }$$或者$$dp_{i,j} = min{dp_{i-1,j+S1-S2}+1, dp_{i-1,j-S1+S2} }$$

哦,滚动数组大法好\(qwq\)

#include <cstdio>
#include <cstring>
#include <iostream> using namespace std ;
const int MAXN = 1010, NN = 5050 ; int out ;
int i, j, k, N, A[MAXN], B[MAXN], dp[2][NN << 2] ; int main(){
cin >> N ; memset(dp, 0x7f, sizeof(dp)) ; dp[0][NN] = 0 ;
for(i = 1; i <= N; i ++) scanf("%d%d", &A[i], &B[i]) ;
for(k = i = 1; i <= N; i ++, k ^= 1){
memset(dp[k], 0x7f, sizeof(dp[k])) ;
for(j = -5000; j <= 5000; j ++)
dp[k][j + NN] = min(dp[k ^ 1][j + A[i] - B[i] + NN], dp[k ^ 1][j - A[i] + B[i] + NN] + 1) ; ;
}
for(i = 0; i <= 5000; i ++){
out = min(dp[N & 1][i + NN], dp[N & 1][-i + NN]) ;
if(out <= 1000) { cout << out ; break ;}
} return 0 ;
}

[Luogu1282]多米诺骨牌(DP)的更多相关文章

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

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

  2. P1282 多米诺骨牌 dp

    思路:dp[i][j] 的j是上半段的和的值   这里表示的是达到上半段值是j的最小次数 答案在最小的可达到的j #include<bits/stdc++.h> using namespa ...

  3. Luogu P1282 多米诺骨牌 DP。。背包?

    背包...差不多..QWQ 设f[i]为达到差值为i的状态需要多少次,那就很显然了: 注意区分正负不同的代价的循环方向 技巧:如果不想改负数的话,那可以移动一下数组下标,用一个新的指针指向原来的数组 ...

  4. 多米诺骨牌放置问题(状压DP)

    例题: 最近小A遇到了一个很有趣的问题: 现在有一个\(n\times m\)规格的桌面,我们希望用\(1 \times 2\)规格的多米诺骨牌将其覆盖. 例如,对于一个\(10 \times 11\ ...

  5. P1282 多米诺骨牌 (差值DP+背包)

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

  6. P1282 多米诺骨牌【dp】

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

  7. 省选训练赛第4场D题(多米诺骨牌)

    题目来自FZU2163 多米诺骨牌 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Vasya很喜欢排多米诺 ...

  8. P1282 多米诺骨牌 (背包变形问题)

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

  9. P1282 多米诺骨牌

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

随机推荐

  1. JQuery 判断指定ID是否存在

  2. MongoDB 安装成为Windows服务

    使用以下命令将MongoDB安装成为Windows服务. mongod --logpath d:\data\logs.txt --dbpath d:\data --directoryperdb --s ...

  3. 四元数(Quaternion)和旋转 +欧拉角

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

  4. Install dotNet Core on Mac

    1. 按照官方页面进行安装 https://www.microsoft.com/net/core#macos 2. 在运行"brew link --force openssl" 时 ...

  5. 自学git心得-4

    本节介绍分支的一些具体应用实例. 1.Bug分支 设想我们正在分支dev上工作,突然接到一个修复bug的命令,我们需要创建分支issue-101来修复它,在此之前我们肯定需要先保存我们当前未完成的工作 ...

  6. 毕向东_Java基础视频教程第20天_IO流(15~17)

    第20天-15-IO流(打印输出流) 打印输出流:PrintWriter与PrintStream 两者的区别:Since JDK 1.4 it's possible to specify the ch ...

  7. Linux下通过samba进行文件共享与挂载

    1.在共享服务端安装samba:# yum install samba samba-client.x86_64 samba-common -y 2.在共享服务端需要防火墙开通139.445端口: # ...

  8. EF学习之CodeFirst(二)--数据迁移

    使用CodeFirst时,如果Model发生改变的话,例如我们给User类里面新加个Sex属性,运行时会出现如下错误: 这时我们需要使用数据迁移来将model的改变同步更新到数据库中. 1.启用数据迁 ...

  9. ORA-28001:口令已经失效

    Oracle11G创建用户时缺省密码过期限制是180天(即6个月),如果超过180天用户密码未做修改则该用户无法登录. 查看密码的有效期设置,LIMIT字段是密码有效天数. select * from ...

  10. Java学习---TCP Socket的学习

    基础知识 1. TCP协议 TCP是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层 ...