题目

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. linux下源码安装

    ●源码的安装(./configure –prefix 命令用法)一般由3个步骤组成:配置(configure).编译(make).安装(make install). Configure是一个可执行脚本 ...

  2. Servlet JDBC Example

    Develop a web application that should have following features. User can register and then login to t ...

  3. linux下编译C/C++ 程序

    C/C++的速度是Python和perl所无法比拟的,尤其对于处理超大的生物信息学文件来说. 最近在写一个最简单的fastq cut工具,Python简直慢到不能忍,8G的fastq.gz文件的cut ...

  4. MyEclipse配置Tomcat服务器(最简单的配置过程)

    MyEclipse配置Tomcat服务器比较简单,在这里直接给出简要的配置步骤了,相信大家都能很容易明白…… 1.Window->Preferences 2.根据你的Tomcat版本找到对应的T ...

  5. 请问WCF 跟 WebService之间的相同跟异同

    https://social.msdn.microsoft.com/Forums/zh-CN/c06420d1-69ba-4aa6-abe5-242e3213b68f/wcf-webservice W ...

  6. redis之数据类型以及使用

    1 redis数据类型 1. string类型: 字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型 最大容量是512M.2. hash类型: ...

  7. luffy后端之跨域corf的解决方法

    跨域CORS 我们现在为前端和后端分别设置两个不同的域名 window 系统: C:\Windows\System32\drivers\etc\host linux/mac系统: /etc/hosts ...

  8. jquery选择器和基本操作

    定义:jQuery 对象就是通过jQuery包装DOM对象后产生的对象.jQuery 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 jQuery 里的方法: ...

  9. PGAdmin 4使用笔记

    1. import 默认username为postgres psql -U username -h localhost -d databasename -f "file address&qu ...

  10. ajax代码整理

    $.ajax({ type: "post", [以POST或GET的方式请求.默认GET.PUT和DELETE也可以用,有的浏览器不支持] url: url, [请求的目的地址,须 ...