一、动态规划的理解
动态规划的实质是分治思想和解决冗余,因此动态规划是一种将问题实例分析为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略
动态规划所针对的问题有一个显著的特征,即它对应的子问题树中的子问题呈现大量的重复。动态规划的关键在于,对于重复的子问题,只在第一次遇到时求解,并把答案保存起来,让以后再遇到时直接引用,不必要重新求解
二、动态规划算法基本求解步骤
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。
(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
三、编程一、二题的递归方程
(1)单调递增最长子序列
代码实现
int getResult(int father[],int sub[],int n){ for(int i=1;i<n;i++){ for(int j = 0; j <i;j++){ if(father[j]<father[i]&&sub[j]>sub[i]-1){ sub[i]=sub[j]+1; } } } int maxsublength=sub[1]; for(int i = 0 ;i < n; i++){ if(sub[i]>maxsublength){ maxsublength = sub[i]; } } return maxsublength; }
(2)租用游艇问题
for(int j =3;j<=n;j++){ for(int i =2;i<j;i++){ if(dis[1][j]>(dis[1][i]+dis[i][j])){ dis[1][j]=dis[1][i]+dis[i][j]; } } }
四、结对编程
这次结对编程主要是队友打的代码比较多,思维也比较get得到点。自己要好好学习,不能推后退了!