关于动态规划,除了ppt里讲到的把子问题的结果保存起来甭管后面是否用到这个显著特点外,根据我目前粗浅的认识,觉得其解题步骤可以细化为以下几步:
1. 根据题设找到或求出初始条件
具体如HDOJ_1466求直线交点数这题,设bool p[21][191](最多输入20条直线,对应最多190个交点),当p[i][j]==true时表示i条直线可以有j个交点。(最多输入20条直线,对应最多190个交点)那么p[i][0]==true;是肯定成立的,即全部直线都平行时交点为0。当然p[i][i-1]==true和p[i][2*i-4]==true等也是成立的,不过它们不是向后推倒的必要初始条件,即有p[i][j]==true就足够了。
2. 【核心】找出递推关系,推得全部子问题的答案
递推方向一般是由简向繁、自底向上。再比如上述的直线交点题:
m条直线的交点方案数
= (m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案
= (m-r)*r + r条之间本身的交点方案数
即p[j][k]→p[i][(i-j)*j+k],或者便于理解的形式:p[m+△x][n]→p[m+△x][m*△x+n],其中△x是增加的平行直线数,它们会和原来的m条直线交出m*△x个新交点,再加上原本的n个交点即可。虽然是二维数组,但存在三个变量,故处理时是三重for循环。