首页 写随笔

cdcq(本博客废弃!现用博客:https://www.cnblogs.com/cdcq/)

本博客废弃!现用博客:https://www.cnblogs.com/cdcq/

导航

神奇的动态多维开点

先上干货,这是动态开5维int

1 int *****f;
2 f=new int ****[v[1]];
3     for(int i1=0;i1<=v[1];i1++){  f[i1]=new int ***[v[2]];
4         for(int i2=0;i2<=v[2];i2++){  f[i1][i2]=new int **[v[3]];
5             for(int i3=0;i3<=v[3];i3++){  f[i1][i2][i3]=new int *[v[3]];
6                 for(int i4=0;i4<=v[4];i4++){  f[i1][i2][i3][i4]=new int [v[5]];
7                     for(int i5=0;i5<=v[5];i5++)  f[i1][i2][i3][i4][i5]=0;
8     }}}}
View Code

更高维的似乎可以用dfs实现?

现在已经确定应该无法实现,因为new后面的*没法实现自动化……

看上去没什么卵用,如果知道总状态数不会太多但是各维状态可能会很大的情况下这个东西就非常好用,比如下面这个题↓

 

神仙姐姐来到一个美丽的地方,不过美中不足的是那儿有好些秃山……
由于神仙过于爱美,由不得有半点瑕疵,所以她想用仙力把这些儿秃山通通消灭掉!由于消灭一座山可能要消耗掉一些Hp Or Mp Or Rp……但是有的时候不必考虑那么多,你有可能只需要考虑HP和MP,甚至仅仅考虑HP.(难道是请了哪位俊男来帮忙…….?)

所有未标明的输入数据,均为longint.且v1*v2……*vm<=100000

 

多维背包,但是v1,v2,v3,v4,v5可能会很大,直接开开不下,一种方法是用hash,或者说进制思想把5维压成1维,因为v1*v2……*vm<=100000,所以只需要开一个一维大小为100000的数组即可(实际上为了尽量避免内存溢出基本不会开成100000的)

但是我弱啊想不出来啊怎么办呐

就可以使用动态开点,代码就是上面给的内个↑

然后就可以开心地水过辣

posted on 2016-10-11 21:36  cdcq_old  阅读(277)  评论(0编辑  收藏  举报