博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1282 多米诺骨牌
阅读量:5936 次
发布时间:2019-06-19

本文共 1622 字,大约阅读时间需要 5 分钟。

题目描述

多米诺骨牌有上下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行点数之差达到最小。
91.png
对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。


这道题是可以勉强的跑一跑背包dp

我才不会考诉你,正解就是背包dp

我们先设f[k][i][j]表示到第k张牌时,当上半部分的点数和为i,下半部分为j时要翻多少次

然后发现,这东西时间复杂度能过,空间复杂度爆炸

然后就要考虑优化。

第一维的优化谁都会,填表法和刷表法都可以

然后我们考虑优化第二第三维。

通常这种情况下,第二位和第三维总是存在的一个不变的关系(Ps:不变是指其关系与另一个无关的量联系在一起,如果没有,请滚去重新设计方程2333333)

我们发现,两部分的和不变。然后我们只需要维护一维就可以了

我们考虑维护差(其实维护一半的和就行了,不知道我那时候抽了什么风,要维护这个23333

然后差有负数呀?c++.不支持负数下标呀

这时我想起一个我特别二的同学。

他写双端队列不用deque,而是开一个二倍空间的数组,从中间开始用

哇塞,人才呀,然后我就使用了这种方法。将5000看做0

// luogu-judger-enable-o2#include
#include
#include
#include
using std::min;const int maxn=1100;int f[2][maxn*10];int m[maxn][2];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&m[i][0],&m[i][1]); memset(f[0],127,sizeof(f[0])); f[0][5000]=0; for(int i=1;i<=n;i++)//使用的是填表法hhh { memset(f[i&1],127,sizeof(f[i&1])); for(int j=10000;j>=0;j--) { f[i&1][j+m[i][0]-m[i][1]]=min(f[i&1][j+m[i][0]-m[i][1]],f[(i&1)^1][j]);//照着状态就是一顿瞎转移233 f[i&1][j+m[i][1]-m[i][0]]=min(f[i&1][j+m[i][1]-m[i][0]],f[(i&1)^1][j]+1); } } for(int i=0;;i++) if(f[n&1][5000+i]<=1000&&f[n&1][5000-i]<=1000)//最后统计答案,至于这个1000是哪里的? //因为我用的是memset初始化的。不知道具体大小。但是最多不翻转超过一千次。所以就用1000判断辣 { printf("%d",min(f[n&1][5000+i],f[n&1][5000-i])); return 0; }}

转载于:https://www.cnblogs.com/Lance1ot/p/9502059.html

你可能感兴趣的文章
Thinkphp开源框架如何使用?
查看>>
c# 读取记事本txt文档到DataTable中
查看>>
BUAAOO第四单元总结
查看>>
java_分数
查看>>
守护线程与非守护线程
查看>>
Js中parentNode,parentElement,childNodes,children之间的区别
查看>>
JS复习:第三章&第四章
查看>>
webpack的问题;
查看>>
如何用JS获取ASP.net中的textbox的值 js获不到text值,【asp.net getElementById用法】
查看>>
ASP.NET弹出对话框几种基本方法
查看>>
正阳门下
查看>>
【01】Python:故事从这里开始
查看>>
理解Underscore中的_.bind函数
查看>>
关于目标检测 Object detection
查看>>
vue-cli 3.0 axios 跨域请求代理配置及生产环境 baseUrl 配置
查看>>
Morris Traversal
查看>>
随机数的扩展--等概率随机函数的实现
查看>>
UVA-10347 Medians 计算几何 中线定理
查看>>
eclipse中怎么删除重复的console
查看>>
软件工程(2019)结对编程第二次作业
查看>>