01 2014 档案

摘要:题意:给定一个n*m的有格子的矩形,现在又两个人在矩形内轮流画矩形,每次都必须沿着格子的轮廓来画,新画的矩形必须嵌套在上一个矩形里面,并且不能和上一个矩形有任何的重复的点。现在这两个人一共会画k次,问一共有多少种不同的画法。这是一个相当好的排列组合题。当然也可以用DP来解。解决本题最最最关键的是要认识到,n和m两个维度是相互独立的,它们互不干扰。这样,可以先来解决线段嵌套的问题,假设我们现在又一根长为M的线段,每1米有一个标记点,现在给你K次机会,不断的从当前的线段的中部去截取一部分,每次截取的时候必须以标记点为端点,问你一共有多少种方法。这显然是C(M-1,2*K)种。为什么呢?因为这相当于 阅读全文
posted @ 2014-01-12 19:48 浙西贫农 阅读(555) 评论(0) 推荐(0)
摘要:比较简单的树形DP题意:一个公司有一个电话网络,每个人的电话只和他的直接上级或者直接下属相连通。整个电话的网络和人事上下级关系一样,是一个树形的结构。现在Tanya希望向网络内的所有人传递一个信息,他就需要去打电话,他每分钟只能打一个电话,且他只能给他的直接上级或下属打电话,问最少需要多少时间,可以使得整个网络都得到这一消息。想法应该很简单,tanya对应的点当根节点,对所有节点来说,他对应的哪个儿子节点需要把消息发布到整棵子树的时间越长,就肯定应该给谁先打电话。然后对时间排序,稍作处理就不难得出答案。代码: 1 #include 2 #include 3 #include 4 #inc... 阅读全文
posted @ 2014-01-11 17:10 浙西贫农 阅读(247) 评论(0) 推荐(0)
摘要:题意:给你三个桶,容量分别为A,B,C,然后问你用这三个没有刻度的桶可以量出多少不同容量的水。0 2 #include 3 const int maxn = 1<<8; 4 bool d[maxn][maxn][maxn]; 5 bool vis[maxn*3]; 6 int A,B,C; 7 8 void dp(int n,int m,int k){ 9 if(d[n][m][k]) return;10 d[n][m][k] = 1;11 vis[n] = 1;12 vis[m] = 1;13 vis[k] = 1;14 vis[n+m] ... 阅读全文
posted @ 2014-01-11 14:55 浙西贫农 阅读(285) 评论(0) 推荐(0)