题面去内网找
其实大模拟可过。题比较水,但考试时越改越没耐心。感觉怎么改都不对。。。还是我区间DP学得太死了。。。其实这题枚举到一个区间时,先处理端点()还有’ ‘,再找中间的运算符就行了。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
int t,n,h,f[60][60];char s[60];
int main()
{
cin>>t;char x;getchar();
while(t--)
{
memset(f,0,sizeof(f));
gets(s+1);n=strlen(s+1);
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
if(s[j]>='0'&&s[j]<='9')f[i][j]=1;
else break;
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
if(s[j]==' ')
{
if(f[i][j-1])f[i][j]=1;
}
else if(s[i]=='('&&s[j]==')')
{
if(f[i+1][j-1])f[i][j]=1;
}
else if(s[i]==' ')
{
if(f[i+1][j])f[i][j]=1;
}
for(int k=i+1;k<j;k++)
{
if(s[k]=='-'||s[k]=='+'||s[k]=='*'||s[k]=='/')
if(f[i][k-1]&&f[k+1][j])f[i][j]=1;
}
}
if(f[1][n])printf("Yes\n");
else printf("No\n");
}
}