dp拿10分
查看原帖
dp拿10分
723198
AAA404楼主2022/10/5 21:17

事情是这样的,本人一眼就瞅见了:

对于50%的数据输入表达式中不含括号。

这句话,于是突发奇想,想骗50分,结果只有10pts 望大佬求调(代码有点抽象,我会加点注释)

#include<bits/stdc++.h>
#define itn int
#define tin int
#define nit int
#define tni int
#define nti int
#define scnaf scanf
#define ptrinf printf
#define icn cin
#define cni cin
#define inc cin
#define nci cin
#define nic cin
#define cuot cout
#define ocut cout
#define fro for
using namespace std;
int L,s,f[1001][1001][2];
string a;
int main()
{
 	//freopen(".in","r",stdin);
 	//freopen(".out","w",stdout);
 	cin>>L;
	cin>>a;
	for(int i=0;i<L;i++)
	{
		if(a[i]!='(' && a[i]!=')')s++; 
	}
	for(int i=0;i<L;i++)
	{
		for(int j=0;j<i;j++)
		{
			if(a[j]=='+' && a[i]=='*')swap(a[j],a[i]);
		}
	}
	s+=1;
	//阶段s,f[i][j][k]为前i个数放前j个符号结果为k 
	for(int i=0;i<=1000;i++)
	for(int j=0;j<=1000;j++)
	for(int k=0;k<=1;k++)
	f[i][j][k]=1;
	for(int i=1;i<=s;i++)
	{
		for(int j=1;j<i;j++)
		{
			for(int k=0;k<=1;k++)
			{
				if(a[j-1]=='*') if(k==0)
				f[i][j][k]=(f[i-1][j-1][k]*2+f[i-1][j-1][k+1])%10007;//乘法为0时从前一个的0可以跟0或1(*2)加上前一个为1时只能跟0(+1)
				else f[i][j][k]=f[i-1][j-1][k];
				else if(k==0)
				f[i][j][k]=f[i-1][j-1][k];
				else f[i][j][k]=(f[i-1][j-1][k-1]+f[i-1][j-1][k]*2)%10007;//加法为1时从前一个的1可以跟0或1(*2)加上前一个为0时只能跟1(+1)
			}
		}
	}
	cout<<f[s][s-1][0]%10007;
 	return 0;
}

2022/10/5 21:17
加载中...