今天首先是个难忘的日子
爱因斯坦的生日
斯蒂芬·霍金逝世
巨星的升起又陨落
愿他们在另一个时间相逢,另一个世界相遇
算是开学来的第一次总结
最近讲了DP,而且也将了些很沉重的话题,关于发展与规划什么的,走一步是一步。
那么关于DP
动态规划(DP)
·定义:
求解决策过程(decision process)最优化的数学方法。
·特性:
最优化原理及最优子结构
一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而 言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。————(引自百度)无后效性
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。————(引自百度)子问题的重叠性
动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。————(引自百度)
ps. 动态规划问题的一般解决步骤
(1).判断问题是否具有最优子结构性质,若不具备则不能用动态规划。
(2).把问题分成若干个子问题(分阶段)。
(3).建立状态转移方程(递推公式)。
(4).找出边界条件。
(5).将已知边界值带入方程。
(6).递推求解。
资源分配类问题
例题
机器分配、复制书稿
做法与要点
资源分配的DP一般用两维解决,一个是接受物品的单位,一个是要分配的事物。当前状态与上一个状态有关于是f[i][j]与f[i-1][j]的关系需要明晰。在空间上可以使用滚动数组进行空间上的优化防止超空间。
背包九讲
01背包
没什么好说的
for(int i=1;i<=n;i++) //n是物品个数
for(int j=V;j>=0;j--)//V是背包体积W[i]是物品重量v[i]是物品体积
if(j>=w[i]) f[j]=max(f[j-w[i]]+v[i],f[j]);
02背包(完全背包)
就相当于原来只有一个的变为∞个
for(int i=1;i<=n;i++)
for(int j=0;j<=V;j++)
if(j>=w[i]) f[j]=max(f[j-w[i]]+v[i],f[j]);
03背包(多重背包)
把物品变成有x个,放入背包
运用二进制思想
for(int i=1;i<=n;i++)
{
if(w[i]*a[i]>=V)
{
for(int j=0;j<=V;j++)
if(j>=w[i])
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
else
{
int k=1,aum=a[i];
while(k<aum);
{
for(int j=V;j>=k*w[i];j--)
f[j]=max(f[j],f[j-k*w[i]]+k*v[i]);
aum-=k;
k+=k;
}
for(int j=V;j>=aum*w[i];j--)
f[j]=max(f[j],f[j-aum*w[i]]+aum*v[i]);
}
}