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 ...
随机推荐
- 20155235 2016-2017-2《Java程序设计》课程总结
每周作业链接汇总 预备作业一:学期前作业 预备作业二:技能获取与C语言学习情况 预备作业三:安装虚拟机与Linux的学习 第一周作业:20155235 2006-2007-2 <Java程序设计 ...
- 同步备份工具之 rsync
1.常用同步方法 SCP. NFS. SFTP. http. samba. rsync. drbd(基于文件系统同步,效率高) 2.rsync 介绍 rsync,英文全称是 remote synchr ...
- Objective-C 方法交换实践(一) - 基础知识
一.Objective-C 中的基本类型 首先看下 Objective-C 的对象模型,每个 Objective-C 对象都是一个指向 Class 的指针.Class 的结构如下: struct ob ...
- cogs930找第k小的数(k-th number)
cogs930找第k小的数(k-th number) 原题链接 题解 好题... 终极版是bzoj3065(然而并不会) 先讲这个题... 维护\(n+1\)个值域线段树(用主席树),标号\(0\) ...
- macOS 10.14 Mojave Apache设置:多个PHP版本
[18/6/2018更新]由于Homebrew/php点击在2018年3月底被弃用,并将所有PHP公式移动到Homebrew/core,我们已经重新设计了我们的指南,使用这个新的水龙头. 如果您过去一 ...
- XAF.web.NewUI:如何自定义主题
一.使用主题制作工具导出主题: 修改主题生成器工具导出的主题.改完后,导出到 App_Themes 文件夹.例如,更改 ASPxGridView 组面板和Pager面板背景色并保存更改. 使用Them ...
- MantisBT导出Excel文件名显示中文的修改方法
我安装的是 mantisbt-2.15.0. 在“查看问题”页面导出Excel文件后,其文件名虽然是我选择的项目名称,但是,若项目名称中有中文,这就是用%加编码显示. 解决方法是: 在 <Ma ...
- 虚拟货币——比特币行情价格分析
最近挖以太币的朋友们在关注以太坊行情时,一定会发现以太币的价格对比之前上涨了不少.肯定有部分朋友想了解这次上涨的原因,我们特地为此查询了一番.因为比特币相当于虚拟货币中的黄金,它的价格波动会波及到其他 ...
- python-__getattr__ 和 __getattribute__
python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用.查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上 ...
- JavaScript学习笔记(五)——类型、转换、相等、字符串
第六章 类型 相等 转换等 一.类型 1 typeof(); typeof是一个内置的JavaScript运算符,可用于探测其操作数的类型. 例: <script language=" ...