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 ...
随机推荐
- 20155333 2016-2017-2 《Java程序设计》第三周学习总结
20155333 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 类定义时使用class关键词,名称使用Clothes,建立实例要使用new关键词. ...
- 为什么说private方法是有罪的
具体的这句话从什么地方获得,我已经无从考证了,但是想想我们现在使用private的场景,你慢慢的就会发现,private的方法,大多数都是copy代码,当然我只是说大多数,还有就是大多数private ...
- windows phone 8.1 让项目开启蓝牙genericAttributeProfile
1.打开项目里面的 Package.appxmanifest 文件 找到<Capabilities>节点,添加代码如下,其中 serviceId:6006 可以自己修改值 <m2: ...
- mysql导入报错【The MySQL server is running with the --event-scheduler=DISABLED】
一.问题: 在进行mysql操作导入库的时候,报出了[The MySQL server is running with the --event-scheduler=DISABLED] 查看后台日志是事 ...
- BZOJ1010_玩具装箱toy_KEY
题目传送门 这道题可以很快想到暴力DP的做法: f[i]=min(f[i],f[j]+(C[i]-C[j]+i-j--L)^); 但是数据范围有50000,这就需要用斜率优化了. 我们设S[i]=C[ ...
- PHPStrom 里修改Emmet对php的自动扩展
PHPStrom 7.1.3 Emmet 想必大家都比较清楚了.Emmet有个特点,对于匹配不到的符号,仍然会自动扩展为标签的形式,比如我输入aaaa,然后按tab,会自动扩展为<aaaa> ...
- 《Flutter实战》开源电子书
<Flutter实战>开源电子书 <Flutter实战> 开源了,本书为 Flutter中文网开源电子书项目,本书系统介绍了Flutter技术的各个方面,本书属于原创书籍(并非 ...
- TPO-17 C2 Reschedule part-time job in campus dining hall
TPO-17 C2 Reschedule part-time job in campus dining hall 第 1 段 1.Listen to a conversation between a ...
- PytorchZerotoAll学习笔记(三)--自动求导
Pytorch给我们提供了自动求导的函数,不用再自己再推导计算梯度的公式了 虽然有了自动求导的函数,但是这里我想给大家浅析一下:深度学习中的一个很重要的反向传播 references:https:// ...
- Python基础知识-06-集合内存布尔False
python其他知识目录 1.判断一个字符串中是否有敏感字符? #str: m_str="我叫魔降风云变" if "魔" in m_str: #判断指定字符是否 ...