Description

Input

第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数的和。保证第一行与第一列的数均为0,且每个和都不超过4(P-1)。

Output

包含N行,每行M个整数,描述你求出的矩阵,相邻的整数用空格分开。(行末不要有多余空格)

Sample Input

3 3 3
0 0 0
0 4 5
0 5 3

Sample Output

0 0 2
2 2 1
1 0 0

HINT

1<=N,M<=200

1<P<=10

首先可以推出,一旦A的第一行与第一列已经确定,那么我们就可以按部就班地
算出A的所有元素的值了。这样一来需要决策的元素个数就从$200^{2}$变成了399
首先不看元素在0到P-1范围内的限制,设A(1,k)和A(k,1)都为0,并计算将A补全。
(此时A中可能有负数或者大于等于P的整数)
这样A中有些值不符合条件,调整A矩阵
当我们改变A(1,1)+=k时,
要把A调整成合法矩阵,事实上只需把i+j为偶数的A(i,j)
全部增加 k,i+j为奇数的 A(i,j)全部减去 k 即可
当我们把A(1,i)增加k时,要把A调整成合法,只需要把第i列奇数位加k,偶数位减k即可。
我们只需要搜索A的第一行,每当确定一个元素,就可以更新A(j,1)的取值范围。
根据公式,除了A(1,1)以外,A(i,1)的取值是互不影响的。
不断更新第一列每个元素的可以取值的范围,一旦出现有某个元素下界大于上界的情况就剪枝
显然这样搜索的字典序是最优的

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int l[][],r[][],a[][],s[][],c[][],n,m,p;
int pd(int x)
{
if (x&) return -;
return ;
}
int get_num(int x,int y)
{
return c[x][y]-pd(x+y)*a[][]-pd(x)*a[][y]-pd(y)*a[x][];
}
bool dfs(int x)
{int k,i,j,ok;
if (x>m) return ;
for (k=;k<p;k++)
{
ok=;
a[][x]=k;
for (i=;i<=n;i++)
{
int rl=(c[i][x]-pd(x+i)*a[][]-pd(i)*a[][x])*(pd(x));
int rr=(c[i][x]-pd(x+i)*a[][]-pd(i)*a[][x]-(p-))*(pd(x));
if (rl>rr) swap(rl,rr);
l[i][x]=max(l[i][x-],rl);
r[i][x]=min(r[i][x-],rr);
if (l[i][x]>r[i][x])
{
ok=;
break;
}
}
if (ok&&dfs(x+)) return ;
}
return ;
}
int main()
{int i,j,k;
cin>>n>>m>>p;
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
scanf("%d",&s[i][j]);
l[i][j]=;r[i][j]=p-;
}
}
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
c[i][j]=s[i][j]-c[i-][j]-c[i][j-]-c[i-][j-];
}
}
for (i=;i<p;i++)
{
a[][]=i;
if (dfs())
{
for (j=;j<=n;j++)
{
a[j][]=l[j][m];
}
for (j=;j<=n;j++)
{
for (k=;k<=m;k++)
a[j][k]=get_num(j,k);
}
break;
}
}
for (i=;i<=n;i++)
{
for (j=;j<m;j++)
{
printf("%d ",a[i][j]);
}
printf("%d",a[i][m]);
printf("\n");
}
}

首先可以推出,一旦 A 的第一行与第一列已经确定,那么我们就可以按部就班地
算出 A 的所有元素的值了。这样一来需要决策的元素个数就从 200 2 变成了 399。
为了方便计算,我们试图建立 A i,j 与第一行或第一列之间的直接等式关系。
以下是一个较易理解的建立等量关系的方法:
首先不看元素在 0 到 P-1 范围内的限制,设 A 1,k 和 A k,1 都为 0,并计算将 A 补全。
(此时 A 中可能有负数或者大于等于 P 的整数)
S:
0 0 0
0 4 5
0 5 3A:
0 0 0
0 4 1
0 1 -3
当我们改变 A 1,1 +=k 时,
要把 A 调整成合法矩阵,事实上只需把 i+j 为偶数的 A i,j
全部增加 k,i+j 为奇数的 A i,j 全部减去 k 即可。
A’: A 1,1 +=1
1 -1 1
-1 5 0
1 0 -2
当我们把 A 1,i 增加 k 时,要把 A 调整成合法,只需要把第 i 列奇数位加 k,偶数位
减 k 即可。
A’: A 1,2 +=1
0 1 0
0 3 1
0 2 -3
修改 A i,1 类似。
设通过令第一行第一列都为 0 得到的矩阵为 C,
那么有公式:
A i,j = C i,j + (-1) i+j-2 A 1,1 + (-1) i-1 A 1,j + (-1) j-1 A i,1
(i>1,j>1)
接下来只需要考虑对第一行第一列进行决策即可。
前 30%的数据可以搜索解决。
另 30%实际上是一个 2-Sat.问题。参见 SGU 307 Cipher。
对于 100%的数据并没有很好的方法。
研究 30%的搜索方法,如果加入较强的剪枝,一般出解是很快的。
我们只需要搜索 A 的第一行,每当确定一个元素,就可以更新 A j,1 的取值范围。
根据公式,除了 A 1,1 以外,A i,1 的取值是互不影响的。
不断更新第一列每个元素的可以取值的范围,一旦出现有某个元素下界大于上界的
情况就剪枝。
显然这样搜索的字典序是最优的。
事实证明这个剪枝效率非常高。

[HNOI2010]MATRIX 矩阵的更多相关文章

  1. 【bzoj2003】[Hnoi2010]Matrix 矩阵

    首先可以知道,如果已知第一行和第一列的数,那么可以很容易的计算出其余的数.进一步的,如果笔算将每个数的表达式写出可以得出如下结论: 第i行的第j个数(i>1,j>1)只与(1,1),(i, ...

  2. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)

    理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...

  3. 理解CSS3 transform中的Matrix(矩阵)

    一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵) ...

  4. HDU5015 233 Matrix(矩阵高速幂)

    HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...

  5. 理解CSS3 transform中的Matrix(矩阵)——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2427 一.哥,我被你 ...

  6. String数据转Matrix矩阵

    String数据转Matrix矩阵 private Matrix String_To_Matrix(string str) { int[] Remove_Num = new int[10]; int ...

  7. Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)

    Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作) 题目描述 在MATLAB中,reshape是一个非常有用的函数,它可以将矩阵变为另一种形状且保持数据 ...

  8. Android中的Matrix(矩阵)

    写在前面 看这篇笔记之前先看一下参考文章,这篇笔记没有系统的讲述矩阵和代码的东西,参考文章写的也有错误的地方,要辨证的看. 如何计算矩阵乘法 android matrix 最全方法详解与进阶(完整篇) ...

  9. 汉高澳大利亚matrix矩阵计算器

    我在梦中的超级计算机超级计算机锯,使用大量阵列的cpu记忆,完成并行计算.一个手机制造商由于使用普通机械提供的服务,往往造成停机.是铁道部列车网络售票的事实. 无法使用云服务.上万台计算机并行处理,因 ...

随机推荐

  1. JavaScript(第十三天)【内置对象】

    学习要点: 1.Global对象 2.Math对象 ECMA-262对内置对象的定义是:"由ECMAScript实现提供的.不依赖宿主环境的对象,这些对象在ECMAScript程序执行之前就 ...

  2. [福大软工] W班 软件产品案例分析

    作业要求 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/1300 评分细则 第一部分 调研,评测 (3 ...

  3. 《Language Implementation Patterns》之 构建语法树

    如果要解释执行或转换一段语言,那么就无法在识别语法规则的同时达到目标,只有那些简单的,比如将wiki markup转换成html的功能,可以通过一遍解析来完成,这种应用叫做 syntax-direct ...

  4. 【Swift】 iOS开发容易产生Bug的地方

    1.隐藏navigationBar(尤其是多级隐藏) 2.共用collectionView或tableView 3.继承关系下,注意覆写父类时的super方法的调用 4.关于权限的问题(相机权限,相册 ...

  5. DES MEI号码加密

    对于加密来说,使用DES加密解密很好,但是为了使不同设备的密文不一样,可以使用 固定字符串 + 设备IMEI号码 加密的方式,这样可以分辨不同手机,限制手机的使用(若是注册,一个手机只有一个IMEI号 ...

  6. SpringMVC 无法访问到指定jsp页面可能的原因

    当出现你的程序可以访问到对应的controller层.但是却无法访问对应的jsp文件时.你首先做的不是检查web.xml等配置文件,而是打开的服务器根文件检查对应路径下的文件是否存在.命名是否正确.命 ...

  7. IdentityServer4实战 - 基于角色的权限控制及Claim详解

    一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...

  8. webapi 使用Autofac 开发经历

    2018/4/6 号 早上五点..被手机震动吵醒. 之后直接打开电脑,打算再加强下我自己的webapi这套东西. 虽然三年的工作经验接触了N多框架和各种风格的开发方式,但是让我自己来搞一套实在不会搞, ...

  9. AngularJS1.X学习笔记12-Ajax

    说到Ajax,你一定是思绪万千,想到XMLHttpRequest,$.ajax(),跨域,异步之类的.本文将探讨一下AngularJS的Ajax. 一.一个简单的例子 <!DOCTYPE htm ...

  10. Python3 re模块(正则表达式)

    一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. (在Python中)它内嵌在Python中,并通过r ...