题目

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. 【LeetCode】28. Implement strStr() (2 solutions)

    Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haysta ...

  2. CC初试啼声-----演讲与我

    演讲与我 我非常讨厌演讲,因为我不会演讲,当我站在许多人面前讲话时,我会非常的紧张,我会血压升高,心跳加速,后背冒冷汗. 第一次演讲应该是在我初二的时候,期末考试结束,班级前五名的同学要做一个分享,我 ...

  3. jfinal集成cas单点认证实践

    本示例jfinal集成cas单点认证,采用获取到登录用户session信息后,在本地站点备份一份session信息,主要做以下几个步骤: 1.站点引入响应jar包: 2.在web.xml中配置对应过滤 ...

  4. Getting Started withProcessing 第八章总结

    运动 在这一章中,作者讲述了如何对图元中的对象进行实现动画的效果. 实现运动的几种方式 在书中,作者通过讲解一些对应的知识,让图元能够产生移动的效果.这几种方式包括: 速度和方向 在全局变量中定义两个 ...

  5. WARNING: CPU: 0 PID: 1 at ./arch/x86/include/asm/fpu/internal.h:373

    ------------[ cut here ]------------WARNING: CPU: 0 PID: 1 at ./arch/x86/include/asm/fpu/internal.h: ...

  6. 机器学习 之k-means和DBSCAN的区别

    目录 1.定义和区别(优缺点对比) 2.kmeans原理 3.DBSCAN原理 1.定义和区别(优缺点对比) 聚类分为:基于划分.层次.密度.图形和模型五大类: 均值聚类k-means是基于划分的聚类 ...

  7. 牛客寒假算法基础集训营6 E 海啸

    题目链接点这里 这个题输入类型是第一次见,并没有把n和m的具体范围给你,但是给了n*m的范围,武断的设为1e6*1e6的二维数组铁铁WA,就将二维数组转换为一维数组 题目类型属于二维数组前缀和,有um ...

  8. 第二阶段——个人工作总结DAY03

    1.昨天做了什么:昨天实现了一个活动跳转到另一个活动. 2.今天做了什么:今天打算将所有的都实现,并且只用一个监听事件封装. 3.遇到的困难:无.

  9. leetcode-algorithms-3 Longest Substring Without Repeating Characters

    leetcode-algorithms-3 Longest Substring Without Repeating Characters Given a string, find the length ...

  10. 安卓——BroadcastReceiver

    package com.example.administrator.myapplication_reciver; import android.content.BroadcastReceiver; i ...