大意: 给定4行的棋盘以及4种大小的正方形方块, 每种各有一定花费, 每次可以选一种方块放在棋盘上, 棋盘对应格子全变为'.', 求最少花费使得棋盘全部变成'.'

状压基本操作练习, 状态取12位, 暴力DP, 这里用0表示'.', 1表示'*', 用较小的列做低位, 前推状态, 具体见代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define pb push_back
using namespace std; const int N = 1e3+10, M = (1<<12)-1, INF = 0x3f3f3f3f;
int n, c[4];
char s[4][N];
int sta[N], dp[N][M+10];
vector<int> mat[3];
void chkmin(int &x,int y) {x=min(x,y);} int main() {
scanf("%d", &n);
REP(i,0,3) scanf("%d", c+i);
REP(i,0,3) scanf("%s", s[i]);
REP(i,0,2) REP(j,0,3) {
int t = M;
REP(k,j,min(3,i+j)) {
REP(kk,0,i) t ^= 1<<(k+4*kk);
}
mat[i].pb(t);
}
REP(i,0,3) REP(j,0,n-1) (sta[j]<<=1)|=(s[i][j]=='*');
memset(dp, 0x3f, sizeof dp);
dp[0][sta[0]^(sta[1]<<4)^(sta[2]<<8)] = 0;
REP(i,0,n-1) PER(j,0,M) if (dp[i][j]!=INF) {
if (!(j&15)) chkmin(dp[i+1][(j>>4)^(sta[i+3]<<8)],dp[i][j]);
chkmin(dp[i+1][0], dp[i][j]+c[3]);
REP(k,0,2) for (int kk:mat[k]) {
chkmin(dp[i][j&kk], dp[i][j]+c[k]);
}
}
printf("%d\n", dp[n-1][0]);
}

Clear The Matrix CodeForces - 903F (状压)的更多相关文章

  1. HDUOJ Clear All of Them I 状压DP

    Clear All of Them I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Oth ...

  2. Codeforces 1215E 状压DP

    题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...

  3. CodeForces 11D(状压DP 求图中环的个数)

    Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...

  4. Vladik and cards CodeForces - 743E (状压)

    大意: 给定序列, 求选出一个最长的子序列, 使得任选两个[1,8]的数字, 在子序列中的出现次数差不超过1, 且子序列中相同数字连续. 正解是状压dp, 先二分转为判断[1,8]出现次数>=x ...

  5. Pollywog CodeForces - 917C (状压)

    链接 大意: 一共n个格子, 初始$x$只蝌蚪在前$x$个格子, 每次最左侧的蝌蚪向前跳, 跳跃距离在范围[1,k], 并且每只蝌蚪跳跃都有一定花费, 有$q$个格子上有石头, 若有蝌蚪跳到某块石头上 ...

  6. Codeforces 678E 状压DP

    题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...

  7. Codeforces 8C 状压DP

    题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...

  8. Keyboard Purchase CodeForces - 1238E (状压)

    大意: 给定串$s$, 字符集为字母表前$m$个字符, 求一个$m$排列$pos$, 使得$\sum\limits_{i=2}^n|{pos}_{s_{i-1}}-{pos}_{s_{i}}|$最小. ...

  9. codeforces 1185G1 状压dp

    codeforces 1185G1. Playlist for Polycarp (easy version)(动态规划) 传送门:https://codeforces.com/contest/118 ...

随机推荐

  1. Python3 简明教程

    Python是由吉多·范罗苏姆(Guido Van Rossum)在90年代早期设计.它是如今最常用的编程 语言之一.它的语法简洁且优美,几乎就是可执行的伪代码. 注意:这篇教程是特别为Python3 ...

  2. linux常用命令:Linux 文件属性详解

    Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: 命令:  ls -lih 输出: [root@loc ...

  3. 安装vscode with springboot

    1.安装jdk8 2.下载vscode,一切按照默认配置完成安装.下载地址:https://code.visualstudio.com 3.安装完成后,运行vscode.如果没有任何反应,在命令行上运 ...

  4. Linux基础命令---cut

    cut 将文件中每一行的指定内容显示到标准输出. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法         cut [ ...

  5. Linux服务器---apache支持SSL

    Apache支持ssl 1.检测是否安装ssl模块,如果没有就安装 [root@localhost cgi-bin]# rpm -qa | grep mod_ssl           //查看是否安 ...

  6. Linux服务器---关闭selinux

    关闭selinux 1.通过命令“getenforce”获取selinux状态, [root@localhost ~]# getenforce Enforcing        //enforcein ...

  7. Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持

    Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持 GitHub - tensorflow/tensorflow: Computation using data flo ...

  8. bzoj1056/1862 [Zjoi2006]GameZ游戏排名系统

    题目链接:1,2 treap恶心题,不多说 #include<algorithm> #include<iostream> #include<cstdlib> #in ...

  9. 静默文件安装安装WebLogic

    一. 本文演示静默文件方式安装     •在Windows上      –打开命令行窗口 –filename.exe -mode=silent -silent_xml=file_path     •在 ...

  10. 查询oracle数据库里面所有的表名

    如果是当前用户,"select * from tab"即可