hdu 6400 Parentheses Matrix
- an empty sequence is balanced;
- if A is balanced, then (A) is also balanced;
- if A and B are balanced, then AB is also balanced.
For example, the following parentheses matrix is a 2×4 matrix with goodness 3, because the second row, the second column and the fourth column are balanced:
)()(
()()
Now, give you the width and the height of the matrix, please construct a parentheses matrix with maximum goodness.
Each test case is a single line of two integers h,w (1≤h,w≤200), the height and the width of the matrix, respectively.
1 1
2 2
2 3
()
)(
(((
)))
首先贪心一下,起点位于第一行和第一列,所以应该尽量在这些位置填'(',首先想到的是把矩形的左上边界填充为'(',右下边界填充为')'
因为第一行,第n行,第1列,第m列一定不是序列,所以这样最多有n+m-4个合法括号序列。

但有一个情况比较特殊,当n=4的时候,上面的方法其实比较亏,以牺牲第一列和最后一列的代价,却只得到了两行合法括号序列。考虑另外一种填充方法:当n比较小的时候,把第一行全部填充为'(',最后一行全部填充为')'

这样以后发现,可以通过调整剩下的位置,让剩下一半的行数成为合法的序列,于是这样最多有(n-2)/2+m=n/2-1+m个合法括号序列
比较一下上面两种方案,因为n和m是可以互换的,不妨假设m>n,第一种方案最多有m+n-4个合法序列,第二种方案最多应该有m+n/2-1,当他们相等时,m+n-4=m+n/2-1,解得n=6,也就是n,m较小的那个比6小的时候,采用第二种方案可以获得更多序列,而n,m都大于等于6的时候应该选择第一种情况。
#include<stdio.h> char w[][];
#define min(a,b) ((a)<(b)?(a):(b))
int main(){
int kase;
int n,m;
scanf("%d",&kase);
while(kase--) {
scanf("%d %d",&n,&m);
if((n&)&&(m&)){/*奇数行 奇数列 0个*/
for(int i=;i<n;++i)
for(int j=;j<m;++j)w[i][j]='('; }
else if(n&){/*奇数行 偶数列 n个*/
for(int i=;i<n;++i){
w[i][]='(';
for(int j=;j<m;++j)
w[i][j]='('+')'-w[i][j-];
}
}
else if(m&){/*偶数行 奇数列 m个*/
for(int j=;j<m;++j){
w[][j]='(';
for(int i=;i<n;++i)
w[i][j]='('+')'-w[i-][j];
}
}
else {/*偶数行 偶数列*/
if(min(n,m)<=){/*选择方案2*/
if(n>m){//行多,n+m/2-1个
for(int i=;i<n;++i)w[i][]='(';
for(int j=;j<m-;++j){
w[][j]='('+')'-w[][j-];
for(int i=;i<n;++i)w[i][j]='('+')'-w[i-][j];
}
for(int i=;i<n;++i)w[i][m-]=')';
}
else {//列多,m+n/2-1个
for(int j=;j<m;++j)w[][j]='(';
for(int i=;i<n-;++i){
w[i][]='('+')'-w[i-][];
for(int j=;j<m;++j)w[i][j]='('+')'-w[i][j-];
}
for(int j=;j<m;++j)w[n-][j]=')';
}
}
else {//偶数行,偶数列 列+行-4个
w[][]='(';w[][m-]=')';
w[n-][]='(';w[n-][m-]=')';
for(int j=;j<m-;++j){//
w[][j]='(';w[n-][j]=')';
}
for(int i=;i<n-;++i){
w[i][]='(';w[i][m-]=')';
}
for(int i=;i<n-;++i){
w[i][]='('+')'-w[i-][];
for(int j=;j<m-;++j){
w[i][j]='('+')'-w[i][j-];
}
}
}
}
/*输出*/
for(int i=;i<n;++i){
for(int j=;j<m;++j)
printf("%c",w[i][j]);
printf("\n");
}
}
}
但是,当行/列数较小的时候,牺牲一半的行/列不一定是坏事,应该特判一下
hdu 6400 Parentheses Matrix的更多相关文章
- HDU - 6400 多校8 Parentheses Matrix(构造)
Parentheses Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- hdu 4965 Fast Matrix Calculation(矩阵高速幂)
题目链接.hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N. 矩阵C = A*B 矩阵M=CN∗N 将矩阵M中的全部元素取模6,得到 ...
- HDU 4965 Fast Matrix Calculation(矩阵高速幂)
HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次.能够变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个 ...
- hdu多校第八场Parentheses Matrix
#include<bits/stdc++.h> using namespace std; ][]; int main() { int t; scanf("%d",&am ...
- 矩阵乘法 --- hdu 4920 : Matrix multiplication
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- hdu 4965 Fast Matrix Calculation
题目链接:hdu 4965,题目大意:给你一个 n*k 的矩阵 A 和一个 k*n 的矩阵 B,定义矩阵 C= A*B,然后矩阵 M= C^(n*n),矩阵中一切元素皆 mod 6,最后求出 M 中所 ...
- hdu 5015 233 Matrix(构造矩阵)
http://acm.hdu.edu.cn/showproblem.php?pid=5015 由于是个二维的递推式,当时没有想到能够这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.依据这一点来 ...
- HDU 3666.THE MATRIX PROBLEM 差分约束系统
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU - 4965 Fast Matrix Calculation 【矩阵快速幂】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4965 题意 给出两个矩阵 一个A: n * k 一个B: k * n C = A * B M = (A ...
随机推荐
- 第三次预作业20155231邵煜楠:虚拟机上的Linux学习
java第三次预作业--虚拟机初体验(学习记录) 学习在笔记本上安装Linux操作系统 通过老师给予的官网链接,下载了VirtualBox-5.1.14-112924-win和Ubuntu-16.04 ...
- 20155322 2017-2018-1 《信息安全系统设计》第五周 MyBash实现
#20155322 2017-2018-1<信息安全系统设计>第五周 MyBash实现 [博客目录] 实现要求 相关知识 bash fork exec wait 相关问题 fork返回两次 ...
- 程序与程序之间共享对象:MarshalByRefObject
源自于:http://stackoverflow.com/questions/439173/message-pumps-and-appdomains/442316 程序与程序之间共享对象: Marsh ...
- Windows下安装RaibbitMQ
1.软件准备 1.1 erlang语言包 到http://www.erlang.org/download.html下载,并且运行! 安装目录C:\Program Files (x86)\erl5.10 ...
- mysql 创建外键时发生错误的原因和解决方法
可以去网上查看错误号,就能知道到底哪里出错了 https://zhidao.baidu.com/question/359868536.html 这里1452对应的错误是因为建立外键的表中还有数据,所以 ...
- java nio通过ByteBuffer输出文件信息
1.通过ByteBuffer的get()方法每次读取一个字节转换成char类型输出. fc = new FileInputStream("src/demo20/data.txt") ...
- git clone、git pull和git fetch的用法及区别
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流.Git 常用命令速查表 最近在一个学习小组里学习AI的课程,我们所有的学习资料和homework都放在gitlab上.今天一个小队友从gitlab ...
- Python环境搭建和pycharm安装
Python环境搭建和pycharm安装 本人安装环境为Windows10系统,下载的Python版本为3.4社区版本,可参考 1.下载Python3.4版本 官网:https://www.pytho ...
- selenium 各种很奇葩的异常
问题1:使用selenium3+java的脚本模拟登陆时,总是提示用户名,密码错误 解决方法:1 在执行输入用户名和密码的代码之前,加上driver.navigate().refresh(); QQ群 ...
- Linux权限管理命令
查询linux命令用法网址:cht.sh 1.chmod——改变文件/目录的权限 用法: ① chmod [{ugoa}{+-=}{rwx}] [文件/目录] ---给文件的(用户.所属组.其他人 ...