BZOJ1197 [HNOI2006]花仙子的魔法

其实是一道奇怪的DP题,蒟蒻又不会做。。。

看了Vfk的题解才算弄明白是怎么一回事:

令f[i, j]表示i维有j个球时最大切割部分,则

f[i, j] = f[i, j - 1] + f[i - 1, j - 1]

其中第一部分很好理解,就是前j - 1个球的最大个数,然后就是第二部分的理解:

j - 1个球后再加一个球,于是最优的情况就是最后一个球与前j - 1个球都相交

而求面试i - 1维的,相交出来的是i - 2维空间  <=> i - 1维空间用j - 1个i - 2个球划分的最优个数。

证毕。。。

 1 /**************************************************************
 2     Problem: 1197
 3     User: rausen
 4     Language: Pascal
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:264 kb
 8 ****************************************************************/
 9
10 var
11   n, m : longint;
12   f : array[0..20, 0..200] of int64;
13   cal : array[0..20, 0..200] of boolean;
14
15 procedure pre_work;
16 var
17   i, j : longint;
18
19 begin
20   for i := 1 to n do begin
21     f[i, 1] := 2;
22     cal[i, 1] := true;
23   end;
24   for j := 1 to m do begin
25     f[1, j] := 2 * j;
26     cal[1, j] := true;
27   end;
28 end;
29
30 function calc(x, y : longint) : int64;
31 begin
32   if cal[x, y] then exit(f[x, y]);
33   cal[x, y] := true;
34   f[x, y] := calc(x - 1, y - 1) + calc(x, y - 1);
35   exit(f[x, y]);
36 end;
37
38 begin
39   readln(m, n);
40   fillchar(cal, sizeof(cal), false);
41   pre_work;
42   writeln(calc(n, m));
43 end.

(p.s. 程序是P的不要怪我>.<。。。是以前写的。。。!)

时间: 2024-11-16 12:35:24

BZOJ1197 [HNOI2006]花仙子的魔法的相关文章

1197: [HNOI2006]花仙子的魔法

1197: [HNOI2006]花仙子的魔法 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 762  Solved: 443[Submit][Status] Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示花仙子在n维空间中实施了m次魔法后,最多能得到多少种不同的花. Sample Input 3

【BZOJ 1197】 [HNOI2006]花仙子的魔法

1197: [HNOI2006]花仙子的魔法 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 771  Solved: 448 [Submit][Status] Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示花仙子在n维空间中实施了m次魔法后,最多能得到多少种不同的花. Sample Input

BZOJ 1197: [HNOI2006]花仙子的魔法【DP】

Description 相传,在天地初成的远古时代,世界上只有一种叫做“元”的花.接下来,出 现了一位拥有魔法的花仙子,她能给花附加属性,从此,“元”便不断变异,产生了大千世界千奇百怪的各种各样的花.据说,花仙子既可存在于二维空间(平 面),又可存在于三维空间(立体),还可存在于n维空间(想象).二维空间的点可用向量(x1,x2)表示,三维空间的点可用向量(x1,x2,x3)表 示,一般来说,n维空间的点可用向量(x1,x2,…,xn)表示.而n维空间中两点(x1,x2,…,xn)与(w1,w2

BZOJ 1197 HNOI2006 花仙子的魔法 递推

题目大意:求n维空间下的m个球最多可以将空间分为多少个区域 VFK的题解: http://vfleaking.blog.163.com/blog/static/174807634201321193348312/ 自己看吧.... 我还在纠结零维空间内放入一个零维的球之后空间到底会被分成几份..... #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> us

BZOJ 1197 花仙子的魔法(递推)

数学归纳法. dp[i][j]=dp[i][j-1]+dp[i-1][j-1]. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <s

bzoj 3669: [Noi2014]魔法森林

3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MB 动点spfa Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N.小E需要通过这一片魔法森林,才能够拜访到隐士. 魔法森林中居住了一些妖怪.每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击.幸运的

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

刷题总结——教主的魔法(bzoj3343)

题目: Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [L,