首页 > 代码库 > BZOJ 1197: [HNOI2006]花仙子的魔法【DP】
BZOJ 1197: [HNOI2006]花仙子的魔法【DP】
Description
相传,在天地初成的远古时代,世界上只有一种叫做“元”的花。接下来,出 现了一位拥有魔法的花仙子,她能给花附加属性,从此,“元”便不断变异,产生了大千世界千奇百怪的各种各样的花。据说,花仙子既可存在于二维空间(平 面),又可存在于三维空间(立体),还可存在于n维空间(想象)。二维空间的点可用向量(x1,x2)表示,三维空间的点可用向量(x1,x2,x3)表 示,一般来说,n维空间的点可用向量(x1,x2,…,xn)表示。而n维空间中两点(x1,x2,…,xn)与(w1,w2,…,wn)之间的距离定义 为。 在n维空间中,花仙子每实施魔法就要选择一个参考点(w1,w2,…,wn)和一个作用半径r,并且参考点的位置和作用半径的大小可以任意选择。这时,n 维空间中所有与参考点(w1,w2,…,wn)之间的距离小于作用半径r的花都会受到这次魔法的影响。每次魔法都会给受到影响的花带来不同的属性,且的效 果可以叠加。一般来说,若花仙子总共实施了m次魔法,则n维空间中处于某点的花所具有的属性可用长度为m的二进制串a1a2…am来描述,其中对 1≤i≤m,若该花受到第i次魔法的影响,则ai的值为1,否则为0。显然,不同的属性对应不同的花。 现在的问题是:花仙子在n维空间中实施了m次魔法后,最多能得到多少种不同的花?
Input
包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n。其中,1≤m≤100,1≤n≤15。
Output
仅包含一个整数,表示花仙子在n维空间中实施了m次魔法后,最多能得到多少种不同的花。
Sample Input
3 1
Sample Output
6
思路:很 好写但不好想的dp 4维以上的空间就脑部不出来了TUT。先想一维的情况:显然k次作用后最多会产生2k种不同的花,二维呢?新增加一次施法次数便是多一个圆,圆和刚才已经 画好的圆相交,我们看新的圆的出现造成了多少种新花的出现,我们不必看分割出了多少个二维平面,而是看圆的二维流形:一条封闭的曲线被分割成了多少部分, 这时问题成了一维的情况,就可以递推了
然后再想到两个三维的球相交在二维上的投影是圆,两个四维的超球体相交在三维的投影是球,因此设 dp[i][j]表示n维空间施法m次能得到最多的不同的花,在二维上分析即可得到dp[i][j]=dp[i-1][j-1]+dp[i][j-1], 代码里用到了滚动数组还是没排上第一页,排第一的那个c++的是怎么写的TAT
#include<cstdio>
long long dp[2][100];
int main()
{
int n,m;
long long *a=dp[0],*b=dp[1];
scanf("%d%d",&m,&n);dp[0][0]=1;
for(int i=1;i<=m;i++)a[i]=i*2;
if(n==1){printf("%lld",a[m]);return 0;}
for(int i=2;i<=n;i++)
{
b[0]=1;
for(int j=1;j<=m;j++) b[j]=b[j-1]+a[j-1];
long long *t=a;a=b;b=t;
}
printf("%lld\n",a[m]);
return 0;
}
BZOJ 1197: [HNOI2006]花仙子的魔法【DP】