对前面几道题目做一下总结。
问题 | 枚举 | 多阶段 | 限制条件 | 目标值 |
---|---|---|---|---|
0-1背包 | 每种物品:放/不放 | 每种物品一个阶段 | 不能超过总重量w | 放完索引物品后,总重量最大 |
双11 | 每种物品:买/不买 | 每种物品一个阶段 | w<=总价格<3w | 放完索引物品后,总价格是大于w的最小值 |
矩阵最短路径长度 | 每个位置移动的方向:向下/右 | 每个位置一个阶段 | 到达(n-1,n-1),最短路径长度 | |
最长递增子序列 | 每个元素是否在递增子序列中:加/不加 | 以第0个元素结尾; 以第1个元素结尾 … 以第n-1个元素结尾 | 考察完数组所有元素,选择长度最长的 | |
莱文斯坦编辑距离 | 当前比较的两个字符不相同时候的处理方式:添加/删除/替换 | 字符的位置:0,1,2… | 考察完数组所有字符,选择编辑距离最短的 | |
硬币找零 | 符合条件不同币值的硬币:第0种、第1种… | 支付1元、2元…w元 | 支付w元,最少硬币数量 |
问题 | 状态转移表维度 | 状态转移表值 | 状态转移方程 | 答案 |
---|---|---|---|---|
0-1背包 | (i,cw) i:第i个物品 cw:当前总重量 | true/false:能否达到那个重量 | state[n-1][j]=true,j最大 | |
双11 | (i,presum) i:第i个物品 cw:当前总价格 | true/false:能否达到那个价格 | state[n-1][j]=true,j>=w,且最小 | |
矩阵最短路径长度 | (i,j) i:第i行 j:第j列 | 到达(i,j)的最短路径长度 | min_dist(i,j)=matrix[i][j]+min(min_dist(i-1,j-1),min_dist(i-1,j)) | min_dist(n-1,n-1) |
最长递增子序列 | (i) i:以第i个元素结尾 | 以第i个元素结尾的最长递增子序列长度 | max_lis(i)=max(max_lis(j))+1 j=0,1,2…i-1,a[i]>a[j] | max_lis(i)的最大值,i=0,1,2…n-1 |
莱文斯坦编辑距离 | (i,j) i:比较字符a[i] j:比较字符b[j] | 最少编辑次数 | a[i]=b[j],min_edit=min(min_edist(i-1,j-1),min_edist(i-1,j)+1,min_edist(i,j-1)+1) a[i]!=b[j],min_edit=min(min_edist(i-1,j-1),min_edist(i-1,j),min_edist(i,j-1)+1)+1 | min_edist(m-1,n-1) m:a字符串的长度,n:b字符串的长度 |
硬币找零 | (x) x:已选择硬币总和 | 最少硬币个数 | F(i)=min(F(x-cic_ici))+1 i=0,1,2,…n-1,x-cic_ici>=0 | F(w) |
根据表格回答以下问题。
1 目标状态与目标值是什么?
根据题目回答。
考察完所有物品;放入物品重量最大。
到达位置(n-1,n-1);最短路径长度。
考察完最后一个元素;最长递增子序列长度。
支付w元;最少应比数量。
两个字符串按位置,字符比较完成;最少编辑次数。
2 多阶段决策问题,按照什么分阶段?
按照目标状态分阶段。
考察完所有物品,最大重量。那就按照物品分阶段。
到达(n-1,n-1)时的最短路径长度,那就按照所在位置分阶段。
考察完数组最后一个元素后的最长递增子序列长度,那就按数组中每一个元素分阶段。
考察完所有物品后总价格最低,那就按照物品分阶段。
支付w元时的最少硬币数量,那就按照支付w-1、w-2…分阶段。
考察完两个字符串所有字符之后的最小编辑次数,那就按照字符位置分阶段。
3 状态表的维度和值是什么?
状态表的维度一般就是分阶段的维度。
按照物品分阶段,状态表维度是物品所在下标。
按照矩阵位置分阶段,状态表维度就是矩阵位置的横纵坐标。
按照支付多少元分阶段,状态表维度就是支付总额。
按照字符位置分阶段,状态表维度就是字符所在位置的下标。
特例:0-1背包问题,因为重量是限制条件,状态表维度是物品下标和重量。
状态表的值一般就是目标值。
目标值是最少编辑次数,状态表的值就是最少编辑次数。
目标值是硬币最少数量,状态表的值就是硬币最少数量。
特例:0-1背包问题,因为重量是限制条件,状态表的值true/false表示能不能达到某个重量。
4 状态转移方程是按照什么列出的?
状态转移方程是按照业务条件列出的。
按照前进方向
按照硬币币值
按照字符相同,不同时候的处理方式