【bzoj2003】[Hnoi2010]Matrix 矩阵
首先可以知道,如果已知第一行和第一列的数,那么可以很容易的计算出其余的数。进一步的,如果笔算将每个数的表达式写出可以得出如下结论:
第i行的第j个数(i>1,j>1)只与(1,1),(i,1),(1,j)有关
更数学化地说,设输入矩阵为S,定义C如下:
C(i,j)=0 i=1或j=1
S(i,j)-C(i,j-1)-C(i-1,j)-C(i-1,j-1) 其余情况
则原矩阵A的第i行的第j个数可按下式确定:
A(i,j)=F(i)*A(i,1)+F(j)*A(1,j)–F(i)*F(j)*A(1,1)+C(i,j) (i>1且j>1)
F(x)在x为奇数时为1否则为-1。
算法一:
直接利用该结论,枚举第一行和第一列的每个数,从而求出剩下所有数,并判断是否符合要求。时间复杂度O(NM*P^(N+M-1)),较好的实现可以通过30%的数据。
算法二:
考虑P=2的情况,每个格子只有两种取值0/1。首先枚举(1,1),那么第一行某个格子(1,j)与第一列某个格子(i,1)唯一确定了格子(i,j),若(1,j)=x且(i,1)=y时(i,j)的取值不合法,则(1,j)取x和(i,1)取y不能同时发生。
这是经典的2-SAT模型,虽然使用拓扑排序可以在O(N*M)的时间内求出一个可行解,但无法求出字典序最小解。这里应使用枚举算法,按字典序的优先级判断每一个点,若该点的取值未确定,先尝试放0,看是否产生矛盾,无矛盾则确定为0否则改为1。该算法的时间复杂度为O((N+M)NM),较好的实现可以通过30%的数据。
算法三:
结合算法一与算法二可以通过60%的数据。
算法四:
对于一般的情况,2-SAT模型并不适用,但可以尝试将算法二稍做修改。即每次从0到P-1枚举取值,找到最小的且不与前面产生矛盾的确定为该格的值。遗憾的是,该算法是错误的,很多时候这样做甚至会丢失可行解!为了避免这种情况,可以使用DFS算法。
具体来说,依次枚举第一行每个格子的取值,每次枚举后判断第一列每个格子是否均有可行的取值,若没有则退出,否则继续枚举下一个格子。若第一行的格子均已确定,则第一列的每个格子直接取可行取值中最小的即可。
由于数据保证有解,对于矩阵较大的情况,解很多,限制很多,搜索树的宽度很小,而矩阵较小时搜索树深度很小,均可以较快的得出答案。更进一步的,在矩阵较大时,基本上不会有回溯的情况,即时间复杂度约等于O(NMP^2),可以通过所有测试数据。
注意:bzoj上没有忽略行末换行和空格,输出有些鬼。。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; #define N 210
#define f(a) a[0][0] int n,m,p;
int c[N][N],v[N][N],a[N][N],l[N][N],r[N][N]; int check(int x)
{
return (x&1) ? -1 : 1;
} int dfs(int d)
{
if (d>=m)
return true;
for (int k=0;k<p;k++)
{
bool res(true);
a[0][d]=k;
for (int i=1;i<n;i++)
{
int r1=(c[i][d]+f(a)*check(i+d+1)+a[0][d]*check(i))*(-check(d));
int r2=(c[i][d]+f(a)*check(i+d+1)+a[0][d]*check(i)-(p-1))*(-check(d));
if (r1>r2)
swap(r1,r2);
l[d][i]=max(l[d-1][i],r1);
r[d][i]=min(r[d-1][i],r2);
if (l[d][i]>r[d][i])
{
res=false;
break;
}
}
if (res)
if (dfs(d+1))
return 1;
}
return 0;
} int main()
{
scanf("%d%d%d",&n,&m,&p);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
{
scanf("%d",&v[i][j]);
r[j][i]=p-1;
}
for (int i=1;i<n;i++)
for (int j=1;j<m;j++)
c[i][j]=v[i][j]-(c[i-1][j]+c[i][j-1]+c[i-1][j-1]);
for (int ii=0;ii<p;ii++)
{
f(a)=ii;
if (dfs(1))
{
for (int i=1;i<n;i++)
a[i][0]=l[m-1][i];
for (int j=1;j<n;j++)
for (int k=1;k<m;k++)
a[j][k]=c[j][k]+check(k)*a[j][0]+check(j)*a[0][k]+check(j+k+1)*f(a);
break;
}
}
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
printf("%d%s",a[i][j],j+1==m?"\n":" ");
return 0;
}
【bzoj2003】[Hnoi2010]Matrix 矩阵的更多相关文章
- [HNOI2010]MATRIX 矩阵
Description Input 第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数 ...
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...
- 理解CSS3 transform中的Matrix(矩阵)
一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵) ...
- HDU5015 233 Matrix(矩阵高速幂)
HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...
- 理解CSS3 transform中的Matrix(矩阵)——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2427 一.哥,我被你 ...
- String数据转Matrix矩阵
String数据转Matrix矩阵 private Matrix String_To_Matrix(string str) { int[] Remove_Num = new int[10]; int ...
- Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)
Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作) 题目描述 在MATLAB中,reshape是一个非常有用的函数,它可以将矩阵变为另一种形状且保持数据 ...
- Android中的Matrix(矩阵)
写在前面 看这篇笔记之前先看一下参考文章,这篇笔记没有系统的讲述矩阵和代码的东西,参考文章写的也有错误的地方,要辨证的看. 如何计算矩阵乘法 android matrix 最全方法详解与进阶(完整篇) ...
- 汉高澳大利亚matrix矩阵计算器
我在梦中的超级计算机超级计算机锯,使用大量阵列的cpu记忆,完成并行计算.一个手机制造商由于使用普通机械提供的服务,往往造成停机.是铁道部列车网络售票的事实. 无法使用云服务.上万台计算机并行处理,因 ...
随机推荐
- 扫黑除恶Team第四次团队作业
二.博客撰写要求 文章开头给出团队序号,开发的软件名称,仓库地址. 给出完成本次冲刺需要做的事情(Sprint Backlog)及相应说明. 本次冲刺总结. 三.评分规则 注意:本次作业总分61分.发 ...
- 小a与"204"(牛客)
原题 公式 中间数字与变量之间乘号bug省略可能看着有点别扭例如8x2为8*x2 首先设扫一遍后0的个数为x0 2的个数为x2 4的个数为x4 ①如果x0=x4 ans=32*x4+4 ②如果x0&g ...
- Angular网络请求的封装
很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的.这里我来说说我自己的网络请求封装,某种意义上来说 ...
- layuiAdmin 项目修改
layuiAdmin修改 index.js 修改登录url user/login=>publics/login config.js 修改 name 项目名称, tokenName token字段 ...
- python的学习之路(三)
一.set集合#!/usr/bin/env python# *_*coding:utf-8 *_*# Author: harson old_dict = { "#1": {'hos ...
- BUAA_OO_博客作业四
BUAA_OO_博客作业四 1 第四单元两次作业的架构设计 1.1 第13次作业 类图 作业要求:通过实现UmlInteraction这个官方提供的接口,来实现自己的UmlInteraction解 ...
- Windows Server 2008 R2 Enterprise 安装.NET Framework 4.0
由于服务器上没有.NET 4.0 部署不了 4.0及以上版本的网站,所以给他安排一下: 复制下好的.NET Framework 4.0到服务器开始安装: 安装完,重新打开IIS,已经 ...
- 如何实现IIS 7.0对非HTTP协议的支持
在<再谈IIS与ASP.NET管道>介绍各种版本的IIS的设计时,我们谈到IIS 7.0因引入WAS提供了对非HTTP协议的支持.这个对于WCF的服务寄宿来说意义重大,它意味着我们通过II ...
- [luoguP1037] 产生数(floyd + 高精度)
传送门 先用 floyd 求出每一个数可以变成那些数. 然后利用乘法原理求解,需要高精度. 代码 #include <cstdio> #include <cstring> #i ...
- Spring3.2+mybatis3.2+Struts2.3整合配置文件大全
0.配置文件目录 1.Spring配置 applicationContext-dao.xml <?xml version="1.0" encoding="UTF-8 ...