ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[NOI 2001] 陨石的秘密 题解

2021-02-15 22:04:55  阅读:219  来源: 互联网

标签:NOI 结果 题解 sum long 2001 maxn 深度 空串


题目传送门

思路

首先我们发现可以搜索,但是明显会TLE,因为组合数学的结果是以指数倍增长的,结果会很大,明显不行。
由于不要输出路径,那么考虑DP。
令\(f_{i,j,k,d}\)为深度\(d\),{}\(i\)对,[]\(j\)对,()\(k\)对的结果。
我们发现这样很难得出结果。
我们令\(f_{i,j,k,d}\)为深度小于等于\(d\),{}\(i\)对,[]\(j\)对,()\(k\)对的结果,貌似可以好一点得到结果。

我们利用{}[]()将字符串进行分割。令A B,那么就有三种情况:{A}B [A]B (A)B,当然A B也可能是空串。不难证明这种DP方式是不重不漏的。
DP式如下:

\[f_{i,j,k,d}=\sum^{i-1}_{a=0}\sum^{j}_{b=0}\sum^{k}_{c=0}f_{a,b,c,d-1}\times f_{i-a-1,j-b,k-c,d}\ +\ \sum^{j-1}_{a=0}\sum^{k}_{b=0}f_{i,j-1-a,k-b,d}\times f_{0,a,b,d-1}\ +\ \sum^{k-1}_{a=0}f_{i,j,k-a-1,d}\times f_{0,0,a,d-1} \]

初值:\(f_{0,0,0,0}=1\)(空串深度为\(0\)只有\(1\)种可能)

细节

得出最后的 结果是\(f_{l_1,l_2,l_3,d}-f_{l_1,l_2,l_3,d-1}\)。
但是,如果这么做,其实是错误的,因为\(l_1,l_2,l_3,d\)有可能会为\(0\),那么我们就可以发现以下结论:

\(l_1,l_2,l_3\) \(d\) 结果 解释
都为\(0\) \(0\) \(1\) 空串深度为\(0\)只有\(1\)种可能
都为\(0\) 不为\(0\) \(0\) 空串不可能深度为\(1\)
不都为\(0\) \(0\) \(0\) 非空串的深度一定大于等于\(1\)

最后注意精度问题,要用unsigned long long

代码

#include<cstdio>
#include<iostream>
#define maxn 12
#define MOD (ll)11380
#define MODx f[i][j][k][d]%=MOD;
using namespace std;
typedef unsigned long long ll;
ll f[maxn][maxn][maxn][39];
int l1,l2,l3,D;
int main(){
	scanf("%d%d%d%d",&l1,&l2,&l3,&D);
	for(int i=0;i<=D;i++)
	    f[0][0][0][i]=1;
	for(int d=1;d<=D;d++)
	for(int i=0;i<=l1;i++)
	for(int j=0;j<=l2;j++)
	for(int k=0;k<=l3;k++){
		if(i==0&&j==0&&k==0) continue;
		for(int a=0;a<i;a++)
		for(int b=0;b<=j;b++)
		for(int c=0;c<=k;c++){
		f[i][j][k][d]=(f[i][j][k][d]+(ll)f[i-a-1][j-b][k-c][d]*f[a][b][c][d-1])%MOD;
		}
		
		for(int a=0;a<j;a++)
		for(int b=0;b<=k;b++){
		f[i][j][k][d]=(f[i][j][k][d]+(ll)f[i][j-a-1][k-b][d]*f[0][a][b][d-1])%MOD;
		}
		
		for(int a=0;a<k;a++){
		f[i][j][k][d]=(f[i][j][k][d]+(ll)f[i][j][k-a-1][d]*f[0][0][a][d-1])%MOD;
		}
	}
	if(D==0){
		if(l1==0&&l2==0&&l3==0) printf("1");
		else printf("0");
	}
	else if(l1==0&&l2==0&&l3==0){
		printf("0");
	}
	else cout<<(f[l1][l2][l3][D]-f[l1][l2][l3][D-1]+MOD)%MOD;
	return 0;
}

标签:NOI,结果,题解,sum,long,2001,maxn,深度,空串
来源: https://www.cnblogs.com/jiangtaizhe001/p/14405518.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有