动态规划其实与分治法相似,区别在于子问题重叠上,如何避免因子问题重叠而产生的大量无效的运算。对此,一般我们都是整个表来填,根据表还查看已经计算过的子问题结果就可以了。填表是门学问,当然对于我来说,找出最优解的性质也很难。动态规划一般用递归来做省力,所以可以不用动态规划的时候尽量不要用,麻烦。动态规划有以下四个常见步骤:找出最优解的性质,并刻画其结构特征;递归的定义最优值;以自底向上的方式计算出最优值;根据计算最优值时得到的信息,构造最优解。
(1):单调递增最长子序列
for(int i=0;i<=n;i++){
c[i][0]=0;
c[0][i]=0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(b[i-1]==a[j-1])
c[i][j]=c[i-1][j-1]+1;
else if(c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j];
else
c[i][j]=c[i][j-1];
}
(2):租用游艇问题
int cost[n];
cost[1]=0;
for(int i=2;i<=n;i++){
cost[i]=c[1][i];
for(int j=2;j<i;j++){
cost[i]=min(cost[j]+c[j][i],cost[i]);
}
}
这次结对编程中,我明显赶不上我搭档的思考速度,我对动态规划的思想掌握的没有她好。想法也和她不太一样,对此磨了一会儿时间。其他都好。
原文:https://www.cnblogs.com/gyry/p/9942957.html