acwing 2005 中文题面
NC24363 但是是英文题面 来源:USACO 2012 November Contest Bronze
数据比较小 ,dfs就能做
dfs传当前位置以及左右括号的数量,左等于右,更新答案,右大于左,不合法返回,如果右括号数量大于1,就不能在搜左括号了,记得标记以及恢复现场,数据比较小,直接暴力搜就行。
#include<bits/stdc++.h>
using namespace std;
const int N=10;
string s[N];int n,ans=0;
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};
bool vis[N][N];
void dfs(int x,int y,int le,int rg){ //x,y表示当前位置,le表示的是左括号的数量,rg表示的是右括号的数量
vis[x][y]=true; //标记一下
if(le<rg){ // 左小于右则不满足提议返回
return ;
}
else if(le==rg){
ans=max(ans,le+rg); 等于的话就更新答案,
return ; //其实这里返不返回都一样,反正相等之后再搜就不合法了。
}
//cout<<"xxx"<<endl;
for(int i=0;i<4;i++){
int px=x+dx[i];
int py=y+dy[i];
if(px<0||px>=n||py<0||py>=n) continue;
if(vis[px][py]) continue;
if(rg>0){ //如果已经搜过右括号了,那么就不能再搜左括号了,不合法
// cout<<"1x"<<endl;
if(s[px][py]==')'){
dfs(px,py,le,rg+1);
vis[px][py]=false; //恢复现场
}
}
else {
if(s[px][py]==')'){
// cout<<"2x"<<endl;
// vis[px][py]=true;
dfs(px,py,le,rg+1);
vis[px][py]=false;
}
else {
//cout<<"3x"<<endl;
//vis[px][py]=true;
dfs(px,py,le+1,rg);
vis[px][py]=false;
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
}
if(s[0][0]=='('){
dfs(0,0,1,0);
}
cout<<ans<<endl;
}
1090

被折叠的 条评论
为什么被折叠?



