热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【树形DP】保镖排队

保镖排队(p3.pascppinout)【问题背景】教主LHX作为知名人物,时刻会有恐怖分子威胁他的生命。于是教主雇佣了一些保镖来保障他的人生安全。【题目描

保镖排队

(p3.pas/cpp/in/out)

 

【问题背景】

  教主LHX作为知名人物,时刻会有恐怖分子威胁他的生命。于是教主雇佣了一些保镖来保障他的人生安全。

 

【题目描述】

  教主一共雇佣了N个保镖,编号为1~N。每个保镖虽然身手敏捷武功高强,但是他在其余N-1个保镖里,都会有一个“上司”,他会对他的上司言听计从。但一号保镖例外,他武功盖世,不惧怕其余任何保镖,所以他没有上司。

  教主LHX会对这N个保镖进行定期视察。每次视察的时候,首先会让所有保镖排队。

对于每个保镖,在他心目中会对他的所有下属的武功实力排个队。

  现在教主要求排出来的队伍满足:①互为上司-下属的两个保镖,上司在前,下属在后②对于一个保镖的所有下属,武功实力较强的在前,较弱的在后。

  教主想知道,总的排队方法数除以10007的余数是多少。

 

【输入格式】

  输入的第一行为一个正整数T,表示了数据组数。

对于每组数据:

第一行为一个正整数N

  接下来N行,每行描述一个保镖。

  第i+1行,会有一个整数K,代表第i个保镖的下属个数,接下来K个数,代表第i个保镖的下属按照武功实力从高到低的编号。

 

【输出格式】

  输出包括C行,每行对于每组数据输出方案数mod 10007后的结果。

 

【样例输入】

2

5

2 2 3

2 4 5

0

0

0

7

2 2 3

2 4 5

2 6 7

0

0

0

0

 

【样例输出】

3

10

 

【样例说明】

对于第1组数据,有以下3种排列是合法的:

1 2 4 3 5

1 2 3 4 5

1 2 4 5 3

同时满足了123之前且23之前,245之前且45之前

 

【数据规模】

对于20%的数据,有9

对于40%的数据,有对于所有K,有2

对于60%的数据,有100

对于100%的数据,有101000N

 

【考察点】

树形DP

【思路】

看题目,给了若干的从属关系……所以很明显跟树有关了。

先把题目中的森林按照“左儿子,右兄弟”的原则(或者其他的什么原则)转化成一棵二叉树。我们用F[i]表示以i为根的子树的排列方案树,S[i]表示这棵子树的规模,经过一系列各种蛋疼的推导,我们可以找到转移方程: f[x]=f[L[x]]*f[R[x]]*C(s[L[x]]+s[R[x]]-1,s[L[x]]-1),其中C就是组合数呐、

然后就是万年不变的树形DP模式了……

 

话说……我做题的时候完全没有意识到那货是个组合数……我是观察+乱搞得出的……

【提交情况】

1AC

【经验】

那什么……多叉转二叉其实不一定要搞出一棵二叉树,就像线段树一样,心中有树就行了……

【收获】

我觉得搞完这道题……我的代码调试能力又有提升了……

【吐槽】

我怀疑我把Lazarus编译器调蹦了……上述转移方程的某一步计算总是跟手动不一样。搞了很久怒换C++,翻译一次果然就行了……虽然各种后续问题出现,又调了半天= =

还有就是……转二叉还是用标准方法好……奇葩方法很容易在调试的时候把人搅晕……

 

ACCode:


#include 

#include

#include

//#include



using namespace std;





int N;

int c[2500][2500];

int map[2500][2500];

int s[2500],f[2500];



void init()

{

freopen("p3.in","r",stdin);

freopen("p3.out","w",stdout);





c[0][0]=1;

for(int i=1;i<2500;++i)

{

c[i][0]=c[i][i]=1;



for(int j=1;j
c[i][j]=(c[i-1][j-1]+c[i-1][j])%10007;

}

//翻译过来的时候忘掉了……怪不得半天没反应- -



//for (int i=0;i<=20;i++)

//{

//for (int j=0;j<=20;j++)

//cout<
//cout<
//}

}





void readdata()

{

scanf("%d",&N);

for(int i=1;i<=N;++i)

{

scanf("%d",&map[i][0]);

for(int j=1;j<=map[i][0];j++)

scanf("%d",&map[i][j]);

}

}



void solve(int x) //递归没什么要说的……

{

intt;



f[x]=1;

s[x]=0;



for(int i=map[x][0];i>=1;i--)

{

t=map[x][i];

//cout<
solve(t);

f[x]=(((f[x]*f[t])%10007)*(c[s[t]+s[x]-1][s[t]-1]))%10007; //Mod10007这种问题嘛……还是每个小运算都Mod一下,安全起见;这货就是转移方程了……

//cout<<"f["<
s[x]+=s[t];

//cout<
}



s[x]=s[x]+1; //记住维护S数组

}





int main()

{

intt;



init();



scanf("%d",&t);



for(int i=1; i<=t; i++)

{

readdata();

solve(1); //递归处理

//for (int i=1; i<=N; i++) cout<
//cout<
printf("%d\n",f[1]);

}



return 0;

}





推荐阅读
  • 由CStringW(wchar_t)不能正常打印收集的
    WIN7、VS2010(工程字符集为Unicode):源代码如下:CStringWline;rs是ODBC取得的结果集(有汉字),调试发现line能成功读取line.Form ... [详细]
  • 对象内存地址
    主  题 ... [详细]
  • 第3章 感受(一)——3.1. Hello world 经典版
    [回到目录]白话C++第3章.感受Helloworld!,HelloC++,我们来了!3.1.Helloworld经典版毫无疑义,一 ... [详细]
  • 名字空间是为了防止名字污染在标准C++中引入的。它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不干扰,使用时用域操作符(::)来引用。namespace名字{ ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 非授权维修导致iPhone 8屏幕失灵:苹果新固件策略解析
    设备制造商通常希望用户通过官方或授权服务中心进行维修,以确保质量并保障收入。然而,对于消费者而言,价格更低、服务更便捷的非授权维修商更具吸引力。本文将探讨使用非授权服务商更换iPhone 8屏幕可能带来的问题及其背后的技术原因。 ... [详细]
  • 本文探讨了通过非官方渠道在苹果手机上安装已下架的迅雷应用程序的方法及潜在风险,重点讨论了信任开发者可能带来的安全问题。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
author-avatar
尼玛的被注册了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有