https://www.lydsy.com/JudgeOnline/problem.php?id=5248

先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小

棋盘的局面一定是阶梯状,且从上往下递减

可以将轮廓线作为状态,记忆化搜索

用n个数表示一个状态,第i个数表示第i行放了几个

记忆的状态表示当棋盘为这个状态时,接下来再下的最有解

记忆化搜索节省的是接下来再下的时间

#include<map>

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

#define N 11

using namespace std;

int n,m;

int a[N][N],b[N][N];

struct node

{

    int v[N];

    node()

    {

        memset(v,,sizeof(v));

    }

    bool operator < (node p) const

    {

        for(int i=;i<=n;++i)

            if(v[i]<p.v[i]) return true;

            else if(v[i]>p.v[i]) return false;

    }

};

map<node,int>mp;

int dfs(node now,bool who)

{

    if(mp.find(now)!=mp.end()) return mp[now];

    int i;

    for(i=;i<=n;++i)

        if(now.v[i]<m) break;

    if(i>n) return ;

    int s;

    if(!who) s=-2e9;

    else s=2e9;

    for( i=;i<=n;++i)

         if(now.v[i]!=m && (now.v[i]<now.v[i-] || i==))

         {

             now.v[i]++;

             if(!who) s=max(s,dfs(now,who^)+a[i][now.v[i]]);

             else s=min(s,dfs(now,who^)-b[i][now.v[i]]);

             now.v[i]--;

        }

    return mp[now]=s;

}

int main()

{

 //  freopen("data.in","r",stdin);

    scanf("%d%d",&n,&m);

    for(int i=;i<=n;++i)

         for(int j=;j<=m;++j)

             scanf("%d",&a[i][j]);

    for(int i=;i<=n;++i)

         for(int j=;j<=m;++j)

             scanf("%d",&b[i][j]);

    node now;

    printf("%d",dfs(now,));

}

bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋的更多相关文章

  1. bzoj5248 [2018多省省队联测]一双木棋

    直接hash+爆搜即可. #include <cstdio> #include <cstring> #include <iostream> #include < ...

  2. 【刷题】BZOJ 5248 [2018多省省队联测]一双木棋

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

  3. bzoj 5248: [2018多省省队联测]一双木棋

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

  4. BZOJ 5248: [2018多省省队联测]一双木棋(对抗搜索)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 439  Solved: 379[Submit][Status][Discuss] Descriptio ...

  5. B5248 [2018多省省队联测]一双木棋 状压dp

    这个题当时划水,得了二十分,现在来整一整. 这个题用状压来压缩边界线,然后通过记忆化搜索进行dp.我们可以观察到,其实每次转移,就是把一个1向左移一位.最后的状态设为0. 这其中还要有一个变量来记录谁 ...

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

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

  7. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  8. bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...

  9. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

随机推荐

  1. STL数据结构

    priority_queue "C++ reference"上如此解释priority queue:"This context is similar to a heap, ...

  2. Linux预处理、编译、汇编、链接和运行的过程(包括一些基本的命令)

    转自Quinn0918的博客 一.预编译 1.将所有的#define删除,并展开所有的宏定义: 2.处理所有的预编译指令,例如:#if,#elif,#else,#endif; 3.处理#include ...

  3. number (2)变量相关错误

    变量没有被定义 fw cannot be resolved 变量没有被初始化 正确代码 package com.itheima_01; import java.io.FileWriter;import ...

  4. Node 开启

    cmd    //进入命令行 D:     //指定磁盘 cd   文件路径   //指定路径 node 文件名.js       //执行文件 增补: Node执行js文件自动嵌套 (functio ...

  5. jquery 語法

    基本形式: $(selector).action() 文檔加載函數: $(document).Ready{ function(){ //將所有的函數寫到文檔加載函數里,可以防止頁面未加載完全,就執行j ...

  6. ZooKeeper客户端 zkCli.sh 节点的增删改查

    zkCli.sh 在 bin 目录下的  zkCli.sh  就是ZooKeeper客户端 ./zkCli.sh -timeout 5000  -server 127.0.0.1:2181  客户端与 ...

  7. codeforces742B

    Arpa’s obvious problem and Mehrdad’s terrible solution CodeForces - 742B There are some beautiful gi ...

  8. webapi返回泛型给easyui

    由于之前遇到的easyui调用webapi的问题. 参见 :http://blog.csdn.net/hanjun0612/article/details/51144991 所以就考虑,封装一个泛型用 ...

  9. mvc 验证登录

    很多时候,我们需要多个页面验证用户是否登录 有2中方法. 一种是继承 Attrbuite属性,添加验证,这个可以网上搜索. 我一般使用下面的方式 创建BaseWebController继承Contro ...

  10. 最大获利 HYSBZ - 1497 (最大权闭合图)

    最大权闭合图: 有向图,每个点有点权,点权可正可负.对于任意一条有向边i和j,选择了点i就必须选择点j,你需要选择一些点使得得到权值最大. 解决方法: 网络流 对于任意点i,如果i权值为正,s向i连容 ...