总的来说,这周是刷题的一周,尽量在保证着每天一到两题的提交,和上周不同,这周对一维DP有了基本的把握和思考分向,但同时,对二维DP的大部分题目却毫无解决能力。而且,我想在大多时候,如果不告诉我题目是DP,那么我也许还是不会主动的用DP去解决问题,因为在DP训练题中,我有时候都会下意识用普通的解法来解,直至最后发现根本通不过案列,才发现自己的思路是完全错误的。由此可知,我对DP的把握程度还是太浅。
这周对分情况分别讨论的题有了更深入的了解,比如:对M - Functions again中,我开始以为直接对所给的式子进行实现计算即可,但并没有那么简单。算式中的正负并不能轻易的直接实现,因为-1的次数不同,会导致式子的符号呈+ - + - + - + -…和- + - + - + - +…两种情况,要分别用两个数组对不同的形式进行记录。
这几天白天又重新学习了一下最初的PPT,重新学习了基础的DP问题,发现DP的问题有些题目整个问题或者是解决大问题的子问题完全可以套用模板进行求解,例如:P - Max Sum,T - 最大连续子序列 通用了最大连续子序列的想法;Q - Common Subsequence 运用的最大公共子序列的想法。所以将问题模板化也是解决麻烦的一大方法。
还有一个测试案列的小技巧,freopen("in.txt","r",stdin);
,可以节省大量的测试时间。还有就是这周经历了很多提交问题,Time超时和Memory内存超限,让我更加深刻的认识到了优化代码和正确开辟内存的重要性。另外这周还学会了,求最小值时,定义一个Flag=0x3f3f3f3f(0x3f3f3f3f为c++中的最大值);求最小值时,定义一个Flag=-0x3f3f3f3f(-的以后就变成了最小值)。
经典DP已经收尾,但是学习的脚步不能停止,在今后的学习中一定更加细致,做好对基础的学习与巩固。这周还有一个记忆化搜索没有理解,一定会努力将问题在本周解决。区间DP,我来了!