第 3章 动态规划 习题总结
算法实现题 3-0 独立任务最优调度问题
{<f[i,j]=min{f[i-1,j]+b[i],f[i-1,j-a[i]}前i个任务A机器做功j时间,B机器做功最短时间。ans=min{f[n,i]+i}可降维>}
算法实现题 3-1 最少硬币问题
{<f[i,j]=min{f[i-1,j-k*time[i]]+k,f[i-1,j]}前i个硬币组成j钱时所用的最少硬币数。可降维>}
算法实现题 3-2 序关系计数问题
{<f[i,j]=(j+1)*(f[i-1,j]+f[i-1,j-1])前i个数中有j个'<'号的方案数,j+1表示前i个数中被'<'分成j+1个集合,新插入的数所放位置而构成方案数。可降维>}
算法实现题 3-3 多重幂计数问题
{<f[i]=∑(0<=j<i)(f[j]*f[i-j-1])Catalan数,百度百科有Catalan数应用,其中就有这个模型不再啰嗦证明>}
算法实现题 3-4 编辑距离问题
{<f[i,j]=min{f[i-1,j],f[i,j-1],f[i-1,j-1]}+1,s1前i个字符s2前j个字符匹配的最小编辑距离。预处理f[i,0]、f[0,i]>}
算法实现题 3-5 石子合并问题
{<f[i,j]=min{f[i,k]+f[p,j-1]+sum[i,(i+j-2)mod n+1](2<=j<=n,1<=i<=n,1<=k<=j-1,p=(i+k-1)mod n+1)},前i个石子合并j次的最小合并/最大合并,环>}
算法实现题 3-6 数字三角形问题
{<f[i,j]=max{f[i-1,j],f[i-1,j-1]}+a[i,j] 走到第i行j列时的最优值,可倒着来>}
算法实现题 3-7 乘法表问题
{<区间dp,f[l,r,num]=f[l,r,num]+dp(l,i,x1)*dp(i+1,r,x2) l到r间得到的num是从l到i的num*从i+1到r的num得到的。递归版>}
算法实现题 3-8 租用游艇问题
{<类似floyd,f[i,j]=min{f[i,k]+f[k,j],f[i,j](i<k<j)} i到j的最短费用是之际到达或者经由k而产生的>}
算法实现题 3-9 汽车加油行驶问题
{<spfa或者dp,四个方向,有油没油。>}
算法实现题 3-10 最小 m段和问题
{<二分答案+贪心验证>}
算法实现题 3-11 圈乘运算问题算法实现题 3-13 正则表达式匹配问题
{<先讨论*再讨论?再讨论其他>}
算法实现题 3-14 双调旅行售货员问题
{<t[i]=min{t[j]+s[i]+s[j]-2*s[j]+dist[i,j],t[i]}>}
算法实现题 3-15 最大 k乘积问题
{<先预处理每段数字然后f[i,j]=max{f[i-p,j-1]*a[i-p+1,i],f[i,j]}前i个数字j个乘号的最大值。>}
算法实现题 3-16 最少费用购物算法实现题 3-18 最优时间表问题
{<尼克的任务,f[i]=max{f[i],f[a[k].st+a[k].ed]}/f[i]=f[i+1]+1 先按开始时间排序,然后倒着枚举相同开始时间的逐个比较,不同的+1,最后输出n-f[1]>}
算法实现题 3-19 字符串比较问题
{<类似于编辑距离,f[i,j]=min{f[i-1,j]+k,f[i,j-1]+k,f[i-1,j-1]+dist(i,j)} s1前i个字符s2前j个字符的最短扩展距离>}
算法实现题 3-20 有向树 k中值问题
{<f[i,j,k]=min{f[tree[t].child,j,k]+d,f[tree[t].child,i,k-1]} 大概就这个意思,转二叉然后树型dp>}
算法实现题 3-21 有向树独立 k中值问题
{<修改320的话,过了14个,不知正确解>}
算法实现题 3-22 有向直线 m中值问题
{<修改320的话超内存,写直线的吧超时间。。纠结着>}
算法实现题 3-23 有向直线 2中值问题
{<把322中的m改成2,貌似有更优解>}
算法实现题 3-24 树的最大连通分支问题