做题方面,靠着上课老师的讲解又A掉了一道题,有点吃老本的感觉,没有发现自己的进步在哪里,DP这一部分学的实在不怎么样,只知道根据模板往上套,就这样还有些吃力,知道DP的思路,可到了具体的题目上总感觉没有自己完整的思路。
还有一点,现在是知道这是DP专项训练,要是提前不知道的话,我觉得自己很难想到要用DP去解,接下来做题的时候,也许我应该总结一下这些题目的特征,以便在以后和其他题混在一起时也能尽快知道该用什么来做。
问题差不多就是这些,和以前的差不了多少,接下来整理几个知识点吧。
无穷大常量的设定:
最精巧的无穷大常量取值是0x3f3f3f3f
当取这个值时,将某个数组(如数组a)全部赋值为无穷大时可以用memset(a,0x3f,sizeof(a))来实现,因为0x3f3f3f3f的每个字节都是0x3f(其实我现在并不太明白这个字节是怎么算出来的,不过用起来似乎挺方便的,就先记一下吧)
关于memset的一些注意事项:
memset 应该用于对一些简单的纯数据结构进行初始化,不能用在自己定义的类上,自己定义的类还是应该用构造函数来初始化(虽然我老是忘了定义构造函数)
memset是以字节为单位,初始化内存块。由于bool类型和char类型均为1个字节。所以在进行初始化的时候不会发生任何问题(bool类型在存入数组是会进行类型转换,0为false,非0为true)。但是一个int型变量是4个字节,也就是32位二进制数。那么在初始化时会将4个用于初始化的字符组合成一个int型的值。所以,memset 对int数组进行初始化时仅可在初始化的值的最后8位为11111111(255)或00000000(0)时能够正确进行初始化。也就是说int型数组仅能初始化为-1和0。其余方法均不能得到正确的结果。
当memset初始化时,并不会初始化指针指向的int数组单元的值,而会把已经分配过内存的指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,也不应该使用memset来初始化。