P1282 多米诺骨牌题解
【题目链接】
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 多米诺骨牌题解相关推荐
- 洛谷P1282 多米诺骨牌 题解
洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...
- 【动态规划】洛谷 P1282 多米诺骨牌
[动态规划]洛谷 P1282 多米诺骨牌 时间限制: 1 Sec 内存限制: 128 MB 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下 ...
- 【01背包】洛谷P1282多米诺骨牌
题目描述 多米诺骨牌有上下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, ...
- C++ P1282 多米诺骨牌
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- 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] 多米诺骨牌
这道题是一道背包问题,考虑一个背包, 显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的. 所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是 ...
- 多米诺骨牌(洛谷-P1282)
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
最新文章
- 《Javascript入门学习全集》 Javascript学习第二季(实战4)
- 自己动手写一个简单的MVC框架(第一版)
- Failed resolution of: Landroid/support/v7/internal/widget/TintManager;异常解决方法
- 怎样才能让Android平板不卡,如何让你的安卓平板从获新生
- Android 如何将Canvas上绘制的内容保存成本地图片
- Flutter抖动动画、颤抖动画、Flutter文字抖动效果
- 智能家居制作之WiFi遥控家中设备
- 蓝桥杯 BASIC-29 基础练习 高精度加法
- 21天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试
- 「leetcode」1. 两数之和:map等候多时了
- fatal error: stropts.h: 没有那个文件或目录
- i7 8700k和i5 9400f哪个好 i78700k和i59400f性能差距
- ubuntu 20.04安装cuda
- 江苏省计算机Python二级考试 总结
- Collections常用功能、Set与Map集合
- 留数的相关概念及定理
- 《富爸爸穷爸爸》读后感
- SAP 汇兑损益的结转
- input输入框,正则格式化手机号(344)
- 吐槽 | 参加IT培训的正确姿势