习题3

3-1:设f[i]表示前i个数最长递增子序列的长度,则有: f[i] = max{f[j] + 1}(i < j && a[i] > a[j]) (a为输入数组)

3-2: 即找最优LIS,每次找下一个数的位置用二分查找即可。

3-4:1.设a[i][j]表示用前i个硬币找j元钱所用的最少硬币数,则 a[i][j] = min{a[i-1][j-k*a[i]]+k} (0 <= k <= j/a[i])

2.由于计算第i行的值只要用到i-1行的值,用一个滚动数组即可使空间复杂度降为O(L),时间复杂度为O(nL)(化简一下状态方程即可)。

3-5:设n个数的排列数为a(n),则显然有a(n) = n!+C(n,2)(n-1)!+...+C(n,n). 化简即可得 a(n) = 2na(n-1)- n(n-1)a(n-2) + 1(a(1) = 1, a(2) = 3)。

3-6:显然的catalan数,P(n) = P(1)P(n-1)+P(2)P(n-2)+...+P(n-1)P(1).

3-8:设c[i][j]表示A中前i个字符转换为B中前j个字符的编辑距离,则有: c[i][j] = min{c[i-1][j], c[i][j-1], c[i-1][j-1]}

 3-11:典型的背包DP,a[i][j]表示当重量为j时从前i个物品中取所能得到的最大价值,则有:a[i][j] = max{a[i-1][j-k*w[i]]+k*v[i]}

3-12:设a[i][j][k]表示当背包的容量为j时,容积为k时所能得到的最大价值,则: a[i][j][k] = max{a[i-1][j-w[i]][k-b[i]]+v[i], a[i-1][j][k]}

3-15:设a[i][j]表示从出租站i到出租站j所用的最少租金,则: a[i][j] = min{a[i][k]+a[k][j]}(i < k <= j)

3-17:以对角线划分阶段,设a[i][j]为到达坐标(i,j)的最短路程,则: a[i][j] = min{a[i-1][j]+d({i-1,j},{i,j}), a[i][j-1]+d({i,j-1},(i,j}).  d({i-1,j},{i,j})表示坐标{i-1,j}到坐标{i,j}的距离,若有障碍,为无穷大。

 3-20:设有n个物品,则a[x1][x2]...[xn]表示买第i件物品xi所用的最少费用,则有: a[x1][x2]...[xn] = min{a[x1-s1][x2-s2]...[xn-sn]+cost},cost为各种打折的费用。

3-21:三维的最大子段和问题,a[i][j][k]逐行逐层累加即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值