给出一个最大12×1212×1212×12的棋盘,然后棋盘上有黑色或者白色的棋子。每个棋子都有一个权值。现在你要把所有的棋子全部拿走,你有两种取法:1.任意取走一个棋子,付出这个棋子权值的代价。2.取走一对棋子,付出两个棋子权值差绝对值的代价,但是必须要满足的条件是你如果想拿走现在这个棋子,你必须要保证这个棋子作为右上端点的矩形里面没有其它的棋子。求问拿完所有的棋子最小的权值是多少。
首先,单取一个棋子必定劣于取一对棋子,所以只有无法取对的时候才考虑单取。其次,由于数据规模非常小,把取走棋子的状态压缩为一条轮廓线,显然合法的轮廓线只有C2nnC_{2n}^{n}C2nn​条,并且与下方取走哪些棋子一一对应,只需要一个2n2n2n的010101串表示从起点出发000表示向右走,111表示向下走。最后,对于当前的这个状态,在每个010101的位置上可以选择取走这个位置上方的一个棋子。
转移分两种情况:单取一个合法的/暴力枚举一对合法的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MIN(x,y) (x)<(y)?(x):(y)
const int inf=0x3f3f3f3f;
const int N=(1<<24);
int a[12][12];
char ch[12][12];
int f[N];
inline int get(int S,int bit) { return (S>>bit)&1; }
int main() {int n;while(scanf("%d",&n)!=EOF) {for(int i=0;i<n;i++)scanf("%s",ch[i]);for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {scanf("%d",&a[i][j]);  }}  int e=(1<<n)-1,s=e<<n; // right down // down right    fill(f+e,f+s,1e9);f[s]=0;for(int S=s;S>e;S--) {if(__builtin_popcount(S)!=n) continue;int x=n-1,y=n;for(int i=0;i+1<2*n;i++) {if(get(S,i)) x--;else y--;if(!get(S,i)&&get(S,i+1))  { f[S-(1<<i)]=MIN(f[S-(1<<i)],f[S]+(ch[x][y]!='.')*a[x][y]);   int nx=n-1,ny=n;for(int j=0;j+1<i;j++) {if(get(S,j)) nx--;else ny--;if(!get(S,j)&&get(S,j+1)&&ch[x][y]+ch[nx][ny]=='B'+'W') f[S-(1<<i)-(1<<j)]=MIN(f[S-(1<<i)-(1<<j)],f[S]+abs(a[x][y]-a[nx][ny]));}} }}printf("%d\n",f[e]);  }return 0;
}

[2019CCPC秦皇岛] G Game on Chessboard 状压dp相关推荐

  1. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  2. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  3. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  4. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  5. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  6. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

  7. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】

    虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位                                                    \((n >> ...

  8. CF-1238E. Keyboard Purchase (状压dp)

    CF-1238E. Keyboard Purchase (状压dp) 题目链接 题意 长度nnn的字符串为排成一行,这个字符串由mmm个字符组成,你需要确定一种排列方式使得这个字符串的花费最少. 花费 ...

  9. 【PKUWC2018】随机算法【状压dp】【组合计数】

    题意:一张nnn个点mmm条边的无向无权图,求以下算法计算最大独立集的正确率:随机一个排列,依次考虑排列中每一个点,如果不与任何一个独立集中的点相邻则将其加入独立集.模9982443539982443 ...

  10. [NOIP2016]愤怒的小鸟(状压DP)

    [NOIP2016]愤怒的小鸟(状压DP) 题目描述 输入输出格式 输入格式: 第一行包含一个正整数 T,表示游戏的关卡总数. 下面依次输入这 T个关卡的信息.每个关卡第一行包含两个非负整数 n,m, ...

最新文章

  1. java的byte与C#的异同引起的字符处理问题。
  2. 关于 Kubernetes 规划的灵魂 n 问
  3. JavaScript实现更新数字指定偏移量上的值updateBit算法(附完整源码)
  4. SpringMVC_文件上传
  5. 信息学奥赛一本通(1204:爬楼梯)
  6. Animate.css
  7. Android开发笔记(十一)自定义视图的构造方法
  8. Java基础:接口多态的综合案例 —— 笔记本电脑
  9. c++11 多线程依次打印ABC
  10. 【企业】任正非:管理的灰度
  11. SAP固定资产中的几个日期
  12. UE-摄像机视角的切换
  13. 小程序-demo:知乎日报
  14. MGR 8.0 + ProxySQL 2.0 部署实录
  15. 什么是Pytest及Pytest常用方法
  16. Cuckoo Filter(布谷过滤器)
  17. 百度联手清华大学出版社,打造国内首套产教融合人工智能系列教材
  18. WEB 3D SVG CAD 向量 几个实施
  19. WordPress生成sitemap
  20. 计算机模拟合理用药,计算机模拟地塞米松在内耳药物动力学与内耳显微结构三维重建的实验研究...

热门文章

  1. Codeforces Round #807 (Div. 2)
  2. android自定义加载旋转框
  3. python实现图形旋转_图像随机旋转及坐标进行旋转原理及Python实现
  4. 如何对CPU过载进行排查
  5. 网页设计 基础知识汇总
  6. 动态NAT64实验配置
  7. 怎么设置计算机键盘数字键,电脑右边的数字键不能用怎么办_电脑右边数字键盘用不了的修复方法...
  8. R数据框操作 fourth day
  9. LINUX内存管理子系统和进程管理子系统
  10. Photoshop教程_PS渐变工具找不到,怎样导入ps渐变样式?ps渐变使用教程