设$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. Android 中的缓存

    AsimpleCache 1.它可以缓存什么东西? 普通的字符串. json. 序列化的java对象 字节数字. 2.主要特色 1:轻,轻到只有一个JAVA文件.  2:可配置,可以配置缓存路径,缓存 ...

  2. Java+selenium之WebDriver的抛出异常分析(七)

    NoSuchElementException 1.检查元素的定位器是否正确 2.如果定位器正确,增加休眠时间 3.等待了足够的时间依然找不到的话,更换定位器的定位方式 NoSuchWindowExce ...

  3. Just oj 2018 C语言程序设计竞赛(高级组)H: CBT?

    H: CBT? 时间限制: 1 s      内存限制: 128 MB      提交 我的状态 题目描述 对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点. ...

  4. Html中,id、name、class、type的区别

    <input type="text" name="name" id="name" class="txt"> ...

  5. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

  6. MySql中Week()函数的用法

    WEEK(date[,mode]):该函数返回日期的星期数 模式 星期的第一天 范围 星期 1 是第一天 0 Sunday 0-53 一年中多一个星期天 1 Monday 0-53 一年多3天 2 S ...

  7. Filebeat6.31整合Kafka集群消息队列(三)

    wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-linux-x86_64.tar.gz [root@ ...

  8. Python 经典类和新式类

    #!/usr/bin/env python# -*- coding:utf-8 -*-# 作者:Presley# 邮箱:1209989516@qq.com# 时间:2018-10-21# 新式类和经典 ...

  9. css3一道闪光

    <style type="text/css"> .overimg{ position: relative; display: block; /* overflow: h ...

  10. javaNIO的总结

    放大1.5倍查看 使用NIO对文件进行COPY操作 public class TestNIOCopyFile { public static void main(String[] args) thro ...