这几天看动态规划的题目,发现难点还是在于状态转移方程,真的想不出。。。
或者说有的题目大体思路有了,状态方程懂了,但是具体到代码实现上又很难下手(就是那种只明白思路无法用代码实现的感觉。。。)
看着同学们做了好多,自己却不太会做,唉。。。
或许是自己做过的题目和接触到的题目太少了,又把课件从头到尾看了一遍,一点一点的看,具体到每一行,了解题目的大体思路与代码实现,希望能有所收获。
其中给我印象最深刻的还是经典的子序列(和子矩阵)问题,这个系列的方法很是巧妙。在这个系列中每次的状态都要取决于上一次的状态,也就是说我们要想得到最终结果必须试着从上次的状态中摸索出其规律所在。但是如果老师没有讲或者从来没有看过代码实现的话,可能我真的想不出这样的思路(即使明白用经典DP的思想去考虑这个问题)。
想写一下最大M字段和这个思路(不归到题解中去了)(现在已经能完全明白了):
最大M字段和:思路:
dp[i][j]表示前j个元素分成i段的最优解,同时这个最优解是由a[j]元素结束的。
转移方程是dp[i][j]=max{f[i][j-1]+a[j],f[i-1][k]+a[j],(i-1<=k<j)} (i<=j<=n-m+i)
对于自身问题,上面也写的挺清楚了,唉。一是没有对于思路,二是对于问题无法用代码实现。具体怎么做:我想把老师的课件和例题先全部看懂,对于VJudge上的题目,还是尽量去做,如果实在做的太少,就把题目对应的题号记下来,最后等时间截止了,自己再去把没做过的题目去搜一下,弄明白为止。
以下再简单写一下题目里出现的知识点(这几点还有没写的似乎现在并不适合或者说以后都不适合使用)(现在也只能看几眼了解一下罢了,并不真正去使用,尽量还是多看看例题,这些难懂的且不好用的知识点就先放一放):
conio.h:
(在一个程序中出现过,但是似乎并没有什么用处,删除之后并没有影响到程序运行及结果。有人说头文件"conion.h" 是用来清屏的代码.在后面的代码中嵌套'clrscr()'来完成 清屏操作,尝试用代码试了一下,但是在C,C++中都没有编译通过。。。)
conio.h不是C标准库中的头文件,在C standard library,ISO C 和POSIX标准中均没有定义。 conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。 大部分DOS,Windows 3.x,Phar Lap,DOSX,OS/2 or Win32平台上的C编译器提供此文件,UNIX 和Linux平台的c编译器通常不包含此头文件。
#ifndef的用法:
防止头文件的重复包含和编译:不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。(不过目前似乎还没有发现有太大用处)
例:
#ifndef x
//先测试x是否被宏定义过
#define x
//如果没有宏定义下面就宏定义x并编译下面的语句
...
#endif
//如果已经定义了则编译#endif后面的语句
还有一项是freopen()函数,或许以后会有用吧(应该是在再次输入大量数据时能节省时间),但是目前似乎也没有太大用处(用不了),就先不介绍了。