设$f[i][j][k]$表示考虑了前$i$个数字,增加了$j$根火柴,删掉了$k$根火柴是否可能,用bitset加速DP。

然后设$g[i][j]$表示增加了$i$根火柴,删掉了$j$根火柴的最小代价,枚举移动次数进行更新。

决策满足单调性,故可以分治求解。

设$m=14n$,则时间复杂度为$O(\frac{nm^2}{64}+m^2\log m)$。

#include<cstdio>
#include<bitset>
using namespace std;
const int N=205,M=2810,inf=~0U>>1;
int n,m,p1,q1,p2,q2,p3,q3,i,j,k,o,w1[M],w2[M],w3[M],g[M],ans=inf;
int S[10]={126,48,107,121,53,93,95,112,127,125},dx[10][10],dy[10][10];
char a[N],b[N];
bitset<M>f[2][M];
inline void up(int&a,int b){if(a>b)a=b;}
void solve(int l,int r,int dl,int dr){
int m=(l+r)>>1,dm=dl,&t=g[m];
for(int o=dl;o<=m&&o<=dr;o++){
int tmp=w1[i-o]+w2[m-o]+w3[o];
if(tmp<t)t=tmp,dm=o;
}
if(l<m)solve(l,m-1,dl,dm);
if(r>m)solve(m+1,r,dm,dr);
}
int main(){
scanf("%d%s%s%d%d%d%d%d%d",&n,a+1,b+1,&p1,&q1,&p2,&q2,&p3,&q3);
for(i=1;i<=n;i++)a[i]-='0',b[i]-='0';
m=n*14;
for(i=1;i<=m;i++)w1[i]=w1[i-1]+p1*i+q1,w2[i]=w2[i-1]+p2*i+q2,w3[i]=w3[i-1]+p3*i+q3;
for(i=0;i<10;i++)for(j=0;j<10;j++)for(k=0;k<7;k++){
if(!(S[i]>>k&1)&&(S[j]>>k&1))dx[i][j]++;
if((S[i]>>k&1)&&!(S[j]>>k&1))dy[i][j]++;
}
f[0][0][0]=1;
for(i=o=1;i<=n;i++,o^=1){
for(j=0;j<=i*14;j++)f[o][j].reset();
for(j=0;j<=(i-1)*14;j++)for(k=0;k<10;k++)
f[o][j+dx[a[i]][k]+dx[b[i]][k]]|=f[o^1][j]<<(dy[a[i]][k]+dy[b[i]][k]);
}
for(i=0;i<=m;i++){
for(j=0;j<=m;j++)g[j]=inf;
solve(0,m,0,i);
for(j=0;j<=m;j++)if(f[o^1][i][j])up(ans,g[j]);
}
return printf("%d",ans),0;
}

  

BZOJ2828 : 火柴游戏的更多相关文章

  1. 智力火柴游戏Android源码项目

    该游戏源码是一个智力火柴游戏源码,游戏分为难.中.易三种模式,通过对火柴的移动来实现等式分成立,具有极好的市场价值和参考意义. 源码下载: http://code.662p.com/view/9741 ...

  2. Java实现去火柴游戏

    package com.gh.p10; /** * Created by Lenovo on 2014/12/10. */ import java.util.Random; import java.u ...

  3. 取火柴游戏||Nim博弈

    好久之前看的sg函数了 好像就记住一个nim博弈qwq 第一次啊看的时候很迷,现在感觉可以了qwq 首先我们来看一个其他的游戏.(以下游戏只有两个人参与,且足够聪明) 两个人在一张圆形的桌子上放等大的 ...

  4. [SHOI2012] 火柴游戏

    [SHOI2012] 火柴游戏 [题目链接] 链接 [思路要点] 首先发现移动火柴操作可以放到最后做.每一次移动火柴一定可以看做是添加一根火柴再删除一根火柴,并且可以将任意一次添加和一次删除操作合并为 ...

  5. java实现第三届蓝桥杯火柴游戏

    火柴游戏 [编程题](满分34分) 这是一个纵横火柴棒游戏.如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒.其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 火柴棒的 ...

  6. P1247 取火柴游戏

    题目描述 输入k及k个整数n1,n2,-,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不 ...

  7. Luogu P1247 取火柴游戏

    题目链接 \(Click\) \(Here\) 这个题目其实就是一个\(Nim\)游戏的简单模型.对于单个的\(Nim\)游戏(单独一堆的情况),数学归纳可证其\(SG\)函数值等于其石子个数.所以对 ...

  8. 洛谷P1247 取火柴游戏

    经典NIM游戏. 取XOR和即可. 注意输出方案时,找到大于异或和sum的,变为a[i] ^ sum即可. #include <cstdio> ; int a[N]; int main() ...

  9. 【洛谷】P1247 取火柴游戏(Nim)

    题目 传送门:QWQ 分析 蒟蒻根本不会博弈论..... 只知道异或和判断Nim游戏.. 不是很懂输出的选择,所以发一篇博客以待复习 代码 #include <bits/stdc++.h> ...

随机推荐

  1. 20165323 实验二 Java面向对象程序设计

    一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:13:45 - 15:25 实验序号:二 ...

  2. Linux下Nginx安装/启动/重启/停止

    Nginx是高性能的web服务器也是非常好用反向代理服务器,可以实现负载均衡,动静分离等策略,在linux下用的非常多.下面是下载地址   http://nginx.org/en/download.h ...

  3. Redis的并发竞争问题

    问题描述:多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 一个key的值是1,本来按顺序 ...

  4. 异象石(就是sdio宝藏那题)

    题解: 之前这道题写过两次题解了吧.. 实现的时候可以用set<int,cmp>来实现按照dfn排序 代码: 感觉别人的分类讨论比我的简单.. 但我觉得我这个写起来也不烦就不看别人的了.. ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案

    Asp.Net Core2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到 ...

  6. 关于mac的一些常用操作记录

    之前记录过一个关于mac远程连接window机,实现共享文件的记录,今天记录一些常用的操作,会持续更新. 1.谷歌浏览器 f12的操作 command+option+i 打开调试面板 2.打开指定位置 ...

  7. Codeforces 746F Music in Car

    Music in Car 用两个Set维护一下尺取的过程. #include<bits/stdc++.h> #define LL long long #define fi first #d ...

  8. rc.local(ubuntu18.04)

    系统自带服务/lib/systemd/system/rc-local.service 软连接为 /lib/systemd/system/rc.local.service -> rc-local. ...

  9. 如何用 Python 模糊搜索文件

    一.我的文件在哪里? 1.告诉计算机文件在哪 使用路径描述位置 绝对路径——从根目录写到底 内置模块OS 路径 目录 文件 其他系统操作 2.描述文件的特征 用条件判断来筛选 3.对比后打印文件名 用 ...

  10. 给定数组长度2n,分成n对,求n对最小元素之和最大

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...