题目

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2459

题意

N*N 的01方阵,可用操作为把任意0变为1,求操作的最小次数,使得任意位置的上下左右之和(不包含自身)为偶数

思路

如刘书,关键在于状态只有第一行的2^15个。

感想

1. 忘了memset

代码

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <tuple>
#include <cassert> using namespace std;
#define LOCAL_DEBUG
#define NOW_QUEUE (ques[queId])
#define LAST_QUEUE (ques[1 - queId])
const int MAXN = ;
struct Node{
int lineSta;
int lineSum;
int changed;
Node(int _lineSta, int _lineSum, int _changed) {
lineSta = _lineSta;
lineSum = _lineSum;
changed = _changed;
}
};
queue<Node> ques[];
int queId;
int orgStatus[MAXN][MAXN];
int stackedStatus[MAXN];
int statusLimit; int getLineSum(int formerlineSta, int lineSta) {
return (formerlineSta ^ (lineSta >> ) ^ (lineSta << )) & statusLimit;
} int getChanged(int lineno, int lineSta) {
int changedSta = stackedStatus[lineno] ^ lineSta;
int changed = ;
while (changedSta > ) {
changed++;
changedSta -= (changedSta & (-changedSta));
}
return changed;
} int main() {
#ifdef LOCAL_DEBUG
freopen("input.txt", "r", stdin);
//freopen("output2.txt", "w", stdout);
#endif // LOCAL_DEBUG
int T;
scanf("%d", &T);
for (int ti = ; ti <= T; ti++) {
queId = ; int n;
scanf("%d", &n);
for (int i = ; i < n; i++) {
stackedStatus[i] = ;
for (int j = ; j < n; j++) {
scanf("%d", orgStatus[i] + j);
stackedStatus[i] = stackedStatus[i] * + orgStatus[i][j];
}
} statusLimit = ( << n) - ;
for (int sta = ; sta <= statusLimit; sta++) {
if((sta & stackedStatus[]) == stackedStatus[])NOW_QUEUE.push(Node(sta, getLineSum(, sta), getChanged(, sta)));
}
for (int i = ; i < n; i++) {
queId = - queId;
while (!LAST_QUEUE.empty()) {
Node node = LAST_QUEUE.front(); LAST_QUEUE.pop();
Node newNode(node);
newNode.lineSta = stackedStatus[i];
int lastLineSum = node.lineSum ^ stackedStatus[i];
bool fl = true;
for (int j = ; j < n && fl; j++) {
if (lastLineSum & ( << j)) {
if (stackedStatus[i] & ( << j)) { fl = false; break; }
else {
newNode.lineSta |= << j;
}
}
}
if (fl) {
newNode.lineSum = getLineSum(node.lineSta, newNode.lineSta);
newNode.changed = node.changed + getChanged(i, newNode.lineSta);
NOW_QUEUE.push(newNode);
}
}
}
int ans = n * n + ;
while (!NOW_QUEUE.empty()) {
Node node = NOW_QUEUE.front(); NOW_QUEUE.pop();
ans = min(ans, node.changed);
}
if (ans > n * n)printf("Case %d: -1\n", ti);
else printf("Case %d: %d\n", ti, ans);
} return ;
}

UVA 11464 - Even Parity 状态压缩,分析 难度: 2的更多相关文章

  1. 状态压缩+枚举 UVA 11464 Even Parity

    题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...

  2. UVA.11464 Even Parity (思维题 开关问题)

    UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...

  3. UVA 11464 Even Parity(递归枚举)

    11464 - Even Parity Time limit: 3.000 seconds We have a grid of size N x N. Each cell of the grid in ...

  4. UVA 1508 - Equipment dp状态压缩

    题意:  已知n个5元组,从中选出k组,使得这些组中5个位置,每个位置上最大数之和最大. 分析:当k>5时,就是n个5元组最大的数之和,当k<5时,就当做5元组,状态压缩,用00000表示 ...

  5. UVA 11464 Even Parity(部分枚举 递推)

    Even Parity We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a on ...

  6. UVA 11464 - Even Parity(枚举方法)

    D Even Parity Input: Standard Input Output: Standard Output We have a grid of size N x N. Each cell ...

  7. POJ 1753 Flip Game 状态压缩,暴力 难度:1

    Flip Game Time Limit: 1000MS  Memory Limit: 65536K  Total Submissions: 4863  Accepted: 1983 Descript ...

  8. UVA 10651 Pebble Solitaire 状态压缩dp

    一开始还在纠结怎么表示一个状态,毕竟是一个串.后来搜了一下题解发现了这里用一个整数的前12位表示转态就好了 ,1~o,0~'-',每个状态用一个数来表示,然后dp写起来就比较方便了. 代码: #inc ...

  9. UVA 11464 Even Parity (独特思路)

    题意:有一个n*n的01矩阵,任务是把尽可能少的0变成1,使得每个元素的上.下.左.右元素之和为偶数. 思路:很容易想到的思路是枚举每个点是0还是1,因为n<=15,复杂度就是2^225显然TL ...

随机推荐

  1. 大数据算法:kNN算法

    \一.kNN算法概述 kNN是k-Nearest Neighbour的缩写,这是一种非常简单且易于理解的分类算法.回想我们从小到大在认知事物的过程当中,我们是如何判断一种事物是属于哪种类别的?通常的一 ...

  2. x1c 2018 静音调教

    折腾快1周,在去intel官网手动下载最新显卡驱动,手动卸载老驱动,断网,重启,手动安装之后(还要再禁用点和散热相关的设备).终于不卡了.开始工作,但又遇到一个问题:太TM吵了! 经过调教,基本保障看 ...

  3. python - selenium 2 升级到最新版本

    python - selenium 2 升级到最新版本 之前一直用的是selenium 2.48 .firefox36 而实际用户的浏览器可能都有自动更新功能,所以版本基本上是最新的.所以这次专门做了 ...

  4. Sublime Text 安装插件时出现There are no packages available for installation解决步骤

    1.点击 ctrl+`打开控制台后,发现是因为http://packagecontrol.io/channel_v3.json 获取失败,下载v3.json(在百度云盘) 2.找到Sublime\Da ...

  5. 1 虚拟环境virtualenv

    一.windows下虚拟环境创建 1.1 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新 ...

  6. linux常见基本命令

    目录 1.更改文件基本属性 2.Linux文件与目录管理 3.Linux用户和用户组管理 4.磁盘管理 5.Linux vi/vim 6.linux查看防火墙状态及开启关闭命令 1.更改文件基本属性 ...

  7. Hongcow Buys a Deck of Cards CodeForces - 744C (状压)

    大意: n个红黑卡, 每天可以选择领取一块红币一块黑币, 或者买一张卡, 第$i$张卡的花费红币数$max(r_i-A,0)$, 花费黑币数$max(b_i-B,0)$, A为当前红卡数, B为当前黑 ...

  8. 终于可以从百度云上BOS读取数据到本地了

    终于可以从百度云上BOS读取数据到本地了

  9. leetcode-algorithms-14 Longest Common Prefix

    leetcode-algorithms-14 Longest Common Prefix Write a function to find the longest common prefix stri ...

  10. Spring Boot项目打包部署到外部Tomcat

    1.生成war包 1)修改POM文件,将打包类型改为war:<packaging>war</packaging> <packaging>war</packag ...