【题目链接】

P1282

【解题思路】

这道题我本来是想用贪心,用sort从大到小排序后,减去两张骨牌的差直到最小,结果却发现自己WA了。
很显然我的贪心是错误的,于是我后来就用了老师教的 dpdpdp (其实贪心也是可以的)。
我们首先把它当作一道判定性的问题来思考发现其实并不难。
定义 fi,jf_{i,j}fi,j​ 代表前 iii 张骨牌能否凑成差为 jjj,当自己辛辛苦苦码好了代码,却发现问题问的是最少步骤。
不过也没有太大的关系,我们将判定的是否存在的 truetruetrue 和 falsefalsefalse 替换成差为 jjj 的最少步骤就行了。
输出的时候再循环找一个差最小的最少步骤输出即可。
状态转移方程
di,j=min(di−1,k−ai+bi,di−1,k−bi+ai+1)d_{i,j}=min(d_{i-1,k-a_i+b_i},d_{i-1,k-b_i+a_i}+1)di,j​=min(di−1,k−ai​+bi​​,di−1,k−bi​+ai​​+1)
最后我们还能做一个小优化,dpdpdp 时将差最大和最小的范围求出来,找的时候跟方便。

【CODE】

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int n,maxn2,minn,maxn;
const int M=3501;//0的位置,因为有负数不能让数组越界
int a[1010];
int b[1010];
int d[1010][M*2];//正负各一半
int main ()
{cin>>n;for (int i=1;i<=n;i++){cin>>a[i]>>b[i];minn=minn-abs(a[i]-b[i]);//差的最小值maxn=maxn+abs(a[i]-b[i]);//差的最大值}memset(d,127,sizeof(d));//因为要求最小值,初始化为最大值maxn2=d[0][M];d[0][M]=0;//前0张凑成0需要0步for (int i=1;i<=n;i++)for (int k=minn;k<=maxn;k++)d[i][k+M]=min(d[i-1][k-a[i]+b[i]+M],d[i-1][k-b[i]+a[i]+M]+1);//状态转移for (int i=0;i<=max(maxn,abs(minn));i++)if (d[n][M-i]<maxn2||d[n][M+i]<maxn2)//绝对值正负两边都有一个值{cout<<min(d[n][M-i],d[n][M+i]);//取较小的哪一个输出return 0;}return 0;
}

P1282 多米诺骨牌题解相关推荐

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

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

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

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

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

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

  4. P1282 多米诺骨牌

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

  5. C++ P1282 多米诺骨牌

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

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

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

  7. 洛谷p1282多米诺骨牌

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

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

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

  9. 多米诺骨牌(洛谷-P1282)

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

最新文章

  1. 《Javascript入门学习全集》 Javascript学习第二季(实战4)
  2. 自己动手写一个简单的MVC框架(第一版)
  3. Failed resolution of: Landroid/support/v7/internal/widget/TintManager;异常解决方法
  4. 怎样才能让Android平板不卡,如何让你的安卓平板从获新生
  5. Android 如何将Canvas上绘制的内容保存成本地图片
  6. Flutter抖动动画、颤抖动画、Flutter文字抖动效果
  7. 智能家居制作之WiFi遥控家中设备
  8. 蓝桥杯 BASIC-29 基础练习 高精度加法
  9. 21天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试
  10. 「leetcode」1. 两数之和:map等候多时了
  11. fatal error: stropts.h: 没有那个文件或目录
  12. i7 8700k和i5 9400f哪个好 i78700k和i59400f性能差距
  13. ubuntu 20.04安装cuda
  14. 江苏省计算机Python二级考试 总结
  15. Collections常用功能、Set与Map集合
  16. 留数的相关概念及定理
  17. 《富爸爸穷爸爸》读后感
  18. SAP 汇兑损益的结转
  19. input输入框,正则格式化手机号(344)
  20. 吐槽 | 参加IT培训的正确姿势

热门文章

  1. android 截图模糊,Adobe XD导出图片模糊?设置错误啦(切图详解)
  2. Fractions (水)
  3. PMP 考点 第三章 项目经理的角色
  4. 接口调用成功,功能实现但是返回404报错
  5. Amplify Shader Editor 案例解析系列——(1)2Sided
  6. 小米手环NFC 模拟门禁卡 不买东西最简解决方案(100字)
  7. 存储连接应用服务器简单入门
  8. Android OpenGL基础(四、图片后处理)
  9. 关于redis 小白从入门到大神
  10. zsh补全中compinit full initialization问题