比浙江简单多了。。。。。。。。

题目转送:https://www.luogu.org/problemnew/show/P4363

分析:

我们注意到n和m都很小,考虑一下状压dp。

显然,棋子摆成的形状一定是凸包,所以,我们用一个数组h,h[i]表示第i行的棋子个数,一定有h[i]>=h[i+1]

我们发现,dp肯定是要倒着做,因为两方都考虑了最优决策。至于状压,我用了11进制+map

然后就很简单了

#include <bits/stdc++.h>
using namespace std;
#define _l long long
][],b[][];
map<_l,int>dp;
set<_l>hh;
void unzip(int* arr,_l s){
    int pos=n;
    while(s){
        arr[pos--]=s%;s/=;
    }
}
_l zip(int *arr){
    _l w=;
    _l res=;
    ;--i,w*=)
    res+=arr[i]*w;
    return res;
}
void dfs(_l u){
    if(hh.count(u))return;
    ],i;
    ;i<=n+;++i)sta[i]=;
    unzip(sta,u);
    ;hh.insert(u);
    ;i<=n;++i)cnt+=sta[i];++cnt;
    ==)dp[u]=<<;<<;
    ;i<=n;++i){
         || (sta[i-]>sta[i])){
            ++sta[i];if(sta[i]>m){
                --sta[i];continue;
            }
            _l k=zip(sta);
            dfs(k);
            ==)dp[u]=max(dp[u],dp[k]+a[i][sta[i]]);
            else dp[u]=min(dp[u],dp[k]-b[i][sta[i]]);
            --sta[i];
        }
    }
}
int main(){//freopen("in.txt","r",stdin);//freopen("o1.txt","w",stdout);
    scanf("%d%d",&n,&m);
    int i,j;
    ;i<=n;++i);j<=m;++j)scanf("%d",&a[i][j]);
    ;i<=n;++i);j<=m;++j)scanf("%d",&b[i][j]);
    ];
    memset(arr,,sizeof(arr));
    ;i<=n;++i)arr[i]=m;
    _l k=zip(arr);hh.insert(k);dp[k]=;
    dfs();
    printf(]);
}
/*
2 3
3 5 3
4 4 5
2 1 5
5 2 3
*/

noi省选 [九省联考2018]一双木棋题解(状压dp)的更多相关文章

  1. [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP

    题面 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子 ...

  2. BZOJ5248:[九省联考2018]一双木棋——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...

  3. 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告

    P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...

  4. [BZOJ5248][九省联考2018]一双木棋(连通性DP,对抗搜索)

    5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 34[Submit][Status ...

  5. [九省联考2018] 一双木棋 chess

    Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可 ...

  6. Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】

    题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #includ ...

  7. luogu P4363 [九省联考2018]一双木棋chess

    传送门 对抗搜索都不会,我真是菜死了qwq 首先根据题目条件,可以发现从上到下每一行的棋子数是单调不增的,然后n m都比较小,如果把状态搜出来,可以发现合法状态并不多,所以可以用一个11进制数表示状态 ...

  8. [九省联考2018]一双木棋chess

    题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博 ...

  9. 【题解】Luogu P4363 [九省联考2018]一双木棋chess

    原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...

随机推荐

  1. .net Core 2.1 MVC+EF+Redis搭建

    官方学习资料 搭建空MVC框架 1.创建一个空模板 2.创建文件夹 Controllers.Models.Views 3.在Controllers文件夹下创建HomeController.cs 选择C ...

  2. Python 爬虫闯关(第一关)

    在学习爬虫时,遇到了一个有意思的网站,这个网站设置了几个关卡,需要经过爬虫进行闯关,随着关卡的网后,难度不断增加,在闯关的过程中需要学习不同的知识,你的爬虫水平也自然随之提高. 今天我们先来第一关,访 ...

  3. ACM学习历程—HDU 5073 Galaxy(数学)

    Description Good news for us: to release the financial pressure, the government started selling gala ...

  4. Core Data存储数据出错(This NSPersistentStoreCoordinator has no persistent stores (unknown))

    Core Data存储数据的时候崩溃,崩溃信息: reason: 'This NSPersistentStoreCoordinator has no persistent stores (unknow ...

  5. poj 3469 Dual Core CPU——最小割

    题目:http://poj.org/problem?id=3469 最小割裸题. 那个限制就是在 i.j 之间连双向边. 根据本题能引出网络流中二元关系的种种. 别忘了写 if ( x==n+1 ) ...

  6. Java enum(枚举)使用详解之二

    enum 对象的常用方法介绍 int compareTo(E o)            比较此枚举与指定对象的顺序. Class<E> getDeclaringClass()       ...

  7. winform 客户端 HTTP协议与服务端通信以及解决中文乱码

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  8. source in sight 删除工程

    用十六进制编辑器打开  "我的文档/Source Insight/Projects/PROJECTS.DB3" 文件 ,找到你要删除的项目路径及名称字符串,用0替换相关位置的数据.

  9. XML解析代码课堂讲解实例

    //获取所有的子元素,不包括回车 package com.dom4jDemo; import java.io.File; import java.util.List; import org.dom4j ...

  10. Learning Python 011 高级特性 2

    Python 高级特性 2 列表生成式 列表生成式就是指类似这样的代码:[x for x in range(1, 11)] >>> L = [x for x in range(1, ...