| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
有没有大神看看错在哪里啊?纠结啊!#include<iostream>
#include<string.h>
#include<stdio.h>
#define inf 9999
using namespace std;
char str[110];
int dp[110][110];
int v[110][110];
int dps(int i,int j)
{
int k;
if(dp[i][j]!=inf)
return dp[i][j];//已经找到了i到j形成合法串的最短长度
if(i==j)
{
dp[i][j]=2;//相等则添加另一半
v[i][i]=i;//i到i只经过了自己方便后面的输出
}
else if(i==j+1)//考虑遇到()或是[]情况后...
return 0;
else if(str[i]=='('&&str[j]==')'||str[i]=='['&&str[j]==']')
{
v[i][j]=-1;
dp[i][j]=dps(i+1,j-1)+2;
return dp[i][j];
}
else for(k=i;k<j;k++)
{
dp[i][k]=dps(i,k);
dp[k+1][j]=dps(k+1,j);
if(dp[i][j]>dp[i][k]+dp[k+1][j])
{
dp[i][j]=dp[i][k]+dp[k+1][j];
v[i][j]=k;//分割成两块(i,k)和(k+1,j)
}
}
return dp[i][j];//返回已经更新好的值
}
void print(int i,int j)
{
if(i==j+1)
return ;
else if(i==j)
{
if(str[i]=='('||str[i]==')')printf("()");
if(str[i]=='['||str[i]==']')printf("[]");
}
else if(v[i][j]!=-1)
{
print(i,v[i][j]);
print(v[i][j]+1,j);
}
else
{
printf("%c",str[i]);
print(i+1,j-1);
printf("%c",str[j]);
}
return ;
}
int main()
{
while(gets(str))
{
int i,j;
int n=strlen(str);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
dp[i][j]=inf;
v[i][j]=-3;
}
}
dps(0,n-1);
print(0,n-1);
printf("\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator