您的位置:首页 > 其它

FZU2030(括号匹配)

2016-04-07 13:22 567 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110977#problem/E

题目大意:略

题目思路:数据范围很小,可以搜索,但是如果数据范围较大则只能DP

用二维数组表示状态dp[i][j]表示扫描到第i个字符时有j个'('还未完成匹配,而答案就是dp[len-1][0] len表示字符串长度,

dp[len-1][0]表示扫描完最后一个字符后没有未匹配的'('.

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
using namespace std;
#define gamma 0.5772156649015328606065120 //欧拉常数
#define MOD 100000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 10001000
typedef long long LL;
typedef pair<int,int> PII;

char str[20];
int dp[20][20];

int main()
{
int i,m,j;
int x,y,v;
while(scanf("%s",str)!=EOF)
{
mst(dp,0);
dp[0][1]=1;
int len=strlen(str);
for(i=1; i<len; ++i)
for(j=0; j<len; ++j)
{
if(str[i]=='(')   ///扫到一个'('则应该和j-1个'('情况相同
{
if(j)
dp[i][j]=dp[i-1][j-1];
}
else if(str[i]==')')   ///扫到一个')'则该和j+1个'('相同,因为当前的')'会消去一个'('
{
dp[i][j]=dp[i-1][j+1];
}
else   ///如果是?则可以加'(',也可以加')'所以两种情况都要加
{
dp[i][j]=dp[i-1][j+1];
if(j) dp[i][j]+=dp[i-1][j-1];
}
}
printf("%d\n",dp[len-1][0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: