UVA 11464 偶数矩阵(递推 | 进制)
题目链接:https://vjudge.net/problem/UVA-11464
一道比较好的题目。
思路如下:
如果我们枚举每一个数字“变”还是“不变”,那么需要枚举$2^{255}$种情况,很显然不行。
那么我们就来优化一下:我们只枚举第一行的数,然后根据计算得出第二、三....行的数。
这样复杂度就优化到了$O(2^n\times n^2)$。
然后用$A[][]$和$B[][]$分别表示变化前后的矩阵。
那么现在的问题就简化成了如何枚举第一行和如何递推。
枚举第一行:运用了状压的思想,把一行数看成一个二进制数,然后$&(1<<c)$,看是否为1,由此我们就构造了一个如下图所示的矩阵。

递推方法:
求出$B[r-1][c]$的上、左、右数之和,如果为偶数,则$B[r][c]=0$,反之$B[r][c]=1$。
在递推中如果发现由$1$转变到$0$的情况,那么是不可能的。
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring> using namespace std; const int maxn=;
const int INF=0x7f7f7f;
int n,A[maxn][maxn],B[maxn][maxn]; int check(int s){
memset(B,,sizeof(B));
for(int c=;c<n;c++){
if(s&(<<c)) B[][c]=;
else if(A[][c]==) return INF;
}
for(int r=;r<n;r++){
for(int c=;c<n;c++){
int sum=;
if(r>) sum+=B[r-][c];
if(c>) sum+=B[r-][c-];
if(c<n-) sum+=B[r-][c+];
B[r][c]=sum%;
if(A[r][c]==&&B[r][c]==) return INF;
}
}
int cnt=;
for(int r=;r<n;r++)
for(int c=;c<n;c++) if(A[r][c]!=B[r][c]) cnt++;
return cnt;
} int main(){
int T;
scanf("%d",&T);
for(int k=;k<=T;k++){
scanf("%d",&n);
for(int r=;r<n;r++)
for(int c=;c<n;c++) scanf("%d",&A[r][c]);
int ans=INF;
for(int s=;s<(<<n);s++)
ans=min(ans,check(s));
if(ans==INF) ans=-;
printf("Case %d: %d\n",k,ans);
}
return ;
}
AC代码
UVA 11464 偶数矩阵(递推 | 进制)的更多相关文章
- UVA 11464 偶数矩阵
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
- UVa 12034 - Race(递推 + 杨辉三角)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...
- UVA 10288 - Coupons(概率递推)
UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...
- SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)
Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...
- POJ 3734 Blocks 矩阵递推
POJ3734 比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出. 最后来个快速幂加速即可. #include< ...
- uva 11375 Matches (递推)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVa 10561 (SG函数 递推) Treblecross
如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,对手下一轮再放一个就输了. 最后当“ ...
随机推荐
- 未安装Oracle数据库,使用PL\SQL Developer连接远程数据库解决方案
使用PL/SQL远程连接Oracle服务器 背景:本地未安装oracle数据库服务器,希望远程连接Oracle服务器 1.下载oracle数据库客户端 下载64位windows的instantclie ...
- SpringBoot整合RabbitMQ出现org.springframework.amqp.AmqpException: No method found for class
@Component @RabbitListener(queues="my_fanout") public class Consumer { @RabbitHandler ...
- Hibernate的理论知识点
转自网络 一. 对象持久化的理论 1.对象持久化:内存中的对象转存到外部持久设备上,在需要的时候还可以恢复. 2.对象持久化的原因(目标): 物理: 1) 内存不能持久,需要在硬盘上持久保存 //(物 ...
- 关于按下ctrl+z后,之后的cin失效的问题
下面这代码按下Ctrl+z结束while输入后,接下来的cin >> val2就无法输入了 #include <iostream> #include <vector> ...
- 【Python】循环控制保留字
- JAVA 注解教程(五)注解的提取
注解与反射 注解通过反射获取.首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解 public boolean isAnnotationPres ...
- web前端常用库
项目中可能用到的web前端库(持续记录): 1.轻量化货币库:https://github.com/openexchangerates/accounting.js ,美元形式.欧元形式等 2.时间 ...
- 第三十三篇 玩转数据结构——红黑树(Read Black Tree)
1.. 图解2-3树维持绝对平衡的原理: 2.. 红黑树与2-3树是等价的 3.. 红黑树的特点 简要概括如下: 所有节点非黑即红:根节点为黑:NULL节点为黑:红节点孩子为黑:黑平衡 4.. 实现红 ...
- php设计模式之面向接口开发实例代码
<?php header("Content-type:text/html;charset=utf-8"); /** * 共同接口 */ interface db { func ...
- 在网页中插入背景音乐代码(html)
有两种 分别用<bgsound>和<embed></embed>标签,当用<embed>插入背景音乐时可以设置宽度和高度为0,隐藏播放器. 二者的参数如 ...