1、我对动态规划算法的理解
(1)基本概念:
动态规划算法通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推/分治的方式解决。
(2)基本思想:
与分治法类似,把一个大的问题进行拆分,细分成一个个小的子问题,且能够从这些小的子问题的解当中推导出原问题的解。同时还需要满足以下两个重要性质:
①最优子结构性: 即所拆分的子问题的解是最优解;
②子问题重叠性质: 在求解的过程中,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的解题效率。
2、编程题1、2的递归方程
(1)单调递增最长子序列
m[i] = max { m[k] + 1 | a[k] < a[i] } ( 1 <= k < i )
代码实现部分:
int length(int a[],int b[],int n) { for (int i=1;i<n;i++) { for (int j=0;j<i;j++) { if (a[j]<a[i]&&b[j]>=b[i]-1) { b[i]=b[j]+1; } } } int t=b[0]; for (int k=0;k<n;k++) { if (b[k]>t) { t=b[k]; } } return t; }
(2)租用游艇问题
m[i] = min { cost[i][k] + m[k] } ( i < k <= n )
( m[i] : 第i个站点到终点的最小费用)
代码实现部分:
for(i=2;i<=n;i++)//n个站循环n-1次 { for(j=i+1;j<=n;j++)//第1站到第j站 { k=j-i; for(m=k;m<j;m++)//从第1站开始循环,动态规划用递归的方法将问题规模变小 { if(fee[k][j]>fee[k][m]+fee[m][j]) fee[k][j]=fee[k][m]+fee[m][j]; } } } cout<<fee[1][n];//从游艇出租站1到游艇出租站n所需的最少租金
3、结队编程情况
这次结队编程伟严主要负责编写代码,恬萌和我主要负责梳理代码实现的思路,上机实践课整体完成度还不错,不过最后一道题是在课后请教了其他同学才得以正确提交。学习了动态规划算法之后,虽然我理解了这个算法的基本思路,看例题也能看懂,不过轮到自己实际操作的时候才发现想要写出动态规划算法还真的挺难的,主要是平时练习编程的次数太少了吧,想成为大佬的话以后要多注重实践能力。