洛谷 P1282 多米诺骨牌 ( 线性DP )
题意 : 题目链接
分析 :
一开始这个想法也有想到,但是貌似要开很大数组,就感觉应该不行
遂放弃想其他方法,万万没想到注意到可以滚动优化(其实不优化也可以过)
定义 dp[i][j] 表示 到第 i 个数为止,凑成 j 分数所要转的最小次数
转移方程如下
若选择旋转 i 这个多米诺 dp[i][j-Sub[i]] = min( dp[i][j-Sub[i]], dp[i-1][j] )
若选择不旋转 dp[i][j+Sub[i]] = min( dp[i][j+Sub[i]], dp[i-1][j] + 1 )
但是有个问题,就是需要考虑第二维分数有负数的情况
加上一个偏移量就行了,转负为正
#include<bits/stdc++.h> using namespace std; ; const int INF = 0x3f3f3f3f; ][(*maxn)<<]; int L[maxn], R[maxn], Sub[maxn]; int main(void) { ; scanf("%d", &N); ; i<=N; i++) scanf("%d %d", &L[i], &R[i]), Sub[i] = L[i] - R[i], Tot += abs(Sub[i]); memset(dp, INF, sizeof(dp)); dp[][Tot] = ; ; ; i<=N; i++){ ; j<=(Tot<<); j++){ && j+Sub[i] <= (Tot<<) ) dp[idx][j+Sub[i]] = min(dp[idx][j+Sub[i]], dp[idx^][j]); && j-Sub[i] <= (Tot<<) ) dp[idx][j-Sub[i]] = min(dp[idx][j-Sub[i]], dp[idx^][j]+); } if(i != N){///滚动优化的话,每一层的初始都是 INF,所以对于下一层就要赋值为 INF idx ^= ; ; j<=(Tot<<); j++) dp[idx][j] = INF; } } int ans = INF; && r<=(Tot<<); l--,r++){///加上偏移量后 0 由 Tot 代替,从 0 开始左右扫,扫到第一个翻转次数不是初始值的便是答案 if(dp[idx][l] != INF && dp[idx][r] != INF) ans = min(dp[idx][l], dp[idx][r]); else if(dp[idx][l] != INF) ans = dp[idx][l]; else if(dp[idx][r] != INF) ans = dp[idx][r]; if(ans != INF) break; } printf("%d\n", ans); ; }
洛谷 P1282 多米诺骨牌 ( 线性DP )的更多相关文章
- 洛谷P1282 多米诺骨牌 (DP)
洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...
- poj 1717==洛谷P1282 多米诺骨牌
Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6571 Accepted: 2178 Descript ...
- 洛谷P1282 多米诺骨牌
P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S ...
- 【01背包】洛谷P1282多米诺骨牌
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- 洛谷P1282 多米诺骨牌【线性dp】
题目:https://www.luogu.org/problemnew/show/P1282 题意: 给定n个牌,每个牌有一个上点数和下点数.可以通过旋转改变交换上下点数. 问使得上点数之和和下点数之 ...
- 洛谷 P1282 多米诺骨牌("01"背包)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://blog.csdn.net/Darost/artic ...
- 洛谷 [P1282] 多米诺骨牌
这道题是一道背包问题,考虑一个背包, 显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的. 所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是 ...
- yzoj P2043 & 洛谷 P1282 多米诺骨牌 题解
题意 类似于就是背包. 解析 代码 跟解析有点不一样v[i]价值,w[i]重量,s背包容积,背包转移即可. #include<bits/stdc++.h> using namespace ...
- P1282 多米诺骨牌【dp】
P1282 多米诺骨牌 提交 20.02k 通过 6.30k 时间限制 1.00s 内存限制 125.00MB 题目提供者洛谷 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 查看算 ...
随机推荐
- Java并发ReadWriteLock接口
java.util.concurrent.locks.ReadWriteLock接口允许一次读取多个线程,但一次只能写入一个线程. 读锁 - 如果没有线程锁定ReadWriteLock进行写入,则多线 ...
- SpringBoot如何使用PUT、DELETE请求方式
SpringBoot 2.2.X默认不支持put,delete等请求方式的. 首先需要在配置文件中打开他们,代码如下: spring.mvc.hiddenmethod.filter.enabled=t ...
- Luogu P1948 [USACO08JAN]Telephone Lines
题目 两眼题 二分一个\(lim\),然后跑最短路(边权\(\le lim\)的边长度为\(0\),\(>lim\)的长度为\(1\)),然后判断\(dis_{1,n}\le k\). #inc ...
- C中的异常处理
1,C 语言崇尚简洁高效,因此语言本身并没有异常处理的相关语法规则,但是异常处理在 C 语言中 是存在的,我们有必要从 C 语言开始先看一看 C 语言中的异常处理是怎样, 然后对比 C++ 里面的异常 ...
- kafka 教程(四)-原理进阶
kafka 最初由 Linkedin 公司开发,是一个 分布式.支持分区.多副本的,基于 zookeeper 协调的分布式发布订阅消息系统,该公司在 2010 年将 kafka 贡献给 apache ...
- 一道并发和锁的golang面试题
今天面试golang碰到了一道考并发和锁的题目,没有完成,所以把它记录下来,仅为以后复习. 场景:在一个高并发的web服务器中,要限制IP的频繁访问.现模拟100个IP同时并发访问服务器,每个IP要重 ...
- mybatis 插入数据返回 -1
通常使用mybatis对数据进行增删改会进行返回值的判断, 返回值不为1时说明该条语句执行失败,不过今天遇到程序报错返回值不为1,去数据库查看却发现插入成功了,后来知道原来是因为mybatis一次对多 ...
- java线程捕获异常
java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked ex ...
- 吴恩达深度学习:2.15python中的广播
1.Broadcasting example (1)下面矩阵描述了来自四种不同的100克碳水化合物,蛋白质和脂肪的卡路里数量 比如说100g苹果所含的热量有56克来自碳水化合物,相比之下来自蛋白质和脂 ...
- 三种动态加载js的jquery实例代码另附去除js方法
!-- 这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getscript("test.js&quo ...