题解 洛谷 P5694 【[NOI2001]陨石的秘密】

这是一道挺好的dp题,我的方法会理解起来稍微简单点。

题目大意就不赘述了,我们直接考虑状态

\(f[i][j][k][l]\)表示选\(i\)组{},\(j\)组[],\(k\)组()且深度为\(l\)的组合有几种。但是我们发现这样对于S=AB的状态转移是很难实现的。因为AB的深度都不知道,需要依次枚举。

我们可以考虑微调状态,令\(f[i][j][k][l]\)表示选\(i\)组{},\(j\)组[],\(k\)组()且深度小于等于\(l\)的组合有几种。那么这样的话,状态转移貌似就容易实现一点。

但是还有问题:对于一些复杂的SS串,可能会有不止一种分法使它分成AB的形式。

举个具体的例子:枚举A为串 \(()[]\) ,B为串 \([()]\) 时,组合为 $()[][()] \(,但是枚举A为串\)()\(,B为串\)[][()]\(时,组合也为\)()[][()]$。这样就重复了。

所以有这样神奇的转移法出现了:对于每个非空SS串,有且仅有一种分法:找到两个SS串A,B,使得S=(A)B或[A]B或{A}B

证明应该很显然吧

所以这题就基本完结了。转移方程如下:

最后还有几个细节稍微说一下:

1.要预处理\(f[0][0][0][i]=0\),因为可以进行转移的是非空串

2.当输入d=0时,输出特判。其余情况,输出\(f[a][b][c][d]-f[a][b][c][d-1]\)

3.\(f[a][b][c][d]-f[a][b][c][d-1]\)由于取过模,可能是负数,处理一下就好

4.题目描述里有3组样例不要错过

代码应该不用放了吧qwq

posted @ 2020-10-24 20:20  Little09  阅读(142)  评论(0)    收藏  举报