UVA 11464 - Even Parity 状态压缩,分析 难度: 2
题目
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的更多相关文章
- 状态压缩+枚举 UVA 11464 Even Parity
题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...
- UVA.11464 Even Parity (思维题 开关问题)
UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...
- 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 ...
- UVA 1508 - Equipment dp状态压缩
题意: 已知n个5元组,从中选出k组,使得这些组中5个位置,每个位置上最大数之和最大. 分析:当k>5时,就是n个5元组最大的数之和,当k<5时,就当做5元组,状态压缩,用00000表示 ...
- 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 ...
- UVA 11464 - Even Parity(枚举方法)
D Even Parity Input: Standard Input Output: Standard Output We have a grid of size N x N. Each cell ...
- POJ 1753 Flip Game 状态压缩,暴力 难度:1
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4863 Accepted: 1983 Descript ...
- UVA 10651 Pebble Solitaire 状态压缩dp
一开始还在纠结怎么表示一个状态,毕竟是一个串.后来搜了一下题解发现了这里用一个整数的前12位表示转态就好了 ,1~o,0~'-',每个状态用一个数来表示,然后dp写起来就比较方便了. 代码: #inc ...
- UVA 11464 Even Parity (独特思路)
题意:有一个n*n的01矩阵,任务是把尽可能少的0变成1,使得每个元素的上.下.左.右元素之和为偶数. 思路:很容易想到的思路是枚举每个点是0还是1,因为n<=15,复杂度就是2^225显然TL ...
随机推荐
- jS冒泡优化
<script> //冒泡优化 将一个数组中的值从小到大排列 var arr=[65,85,12,36,75,46,50]; var sorted=true; ...
- QT json字符串生成和解析
1 QT json字符串生成和解析 1.1 QT Json解析流程 (1) 字符串转化为QJsonDocument QJsonParseError json_error; QJso ...
- Mac批量转换mp3为caf
创建一个sh文件,输入如下代码后运行. 遍历文件夹中的mp3然后使用afconvert命令进行转换. #!/bin/bash for i in *.mp3; do afconvert $i " ...
- sql server 我常用的语句
1. computed column ) persisted; 2. unique nullable create unique nonclustered index[UniqueName] on [ ...
- python+selenium2(一)
一.安装python (1)在官网下载python的安装包,这里使用的是python3.5.安装一路下一步,安装路径我的是D:\Python35. (2)在计算机的path变量中添加D:\Python ...
- Navicat Premium 12如何激活
Navicat Premium 12如何激活 一.总结 一句话总结:激活过程中一定要断开网络连接,点电脑的飞行模式没有用,断开网络连接之后才有手动激活的选项 需要断网 点电脑的飞行模式无用 二.Nav ...
- (9)进程---JoinableQueue队列
消费者模型-->存和取得过程 和Queue队列区别:解决了Queue队列拿取完,程序阻塞不能自动关闭(依靠放入None来解决)的问题--->参见上个例子 put 存入, get 获取 q. ...
- ORM--Object Relational Mapping
ORM 对象关系映射 Object Relational Mapping, 简称ORM,或O/RM,或O/R mapping 一种程序技术 用于实现面向对象编程语言里 不同类型系统 ...
- 架构探险笔记5-使框架具备AOP特性(下)
开发AOP框架 借鉴SpringAOP的风格,写一个基于切面注解的AOP框架.在进行下面的步骤之前,确保已经掌了动态代理技术. 定义切面注解 /** * 切面注解 */ @Target(Element ...
- harbor安装
一.下载安装包https://github.com/goharbor/harbor/releases wget https://storage.googleapis.com/harbor-releas ...