动态规划
来源:互联网 发布:linux安装glibc2.14 编辑:程序博客网 时间:2024/05/29 04:37
对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。
比如如下的字符串:我们通过种种操作,编辑距离为3。
现有两个序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi},
设一个C[i,j]保存Xi与Yj的当前最小的LD。
①:当 Xi = Yi 时,则C[i,j]=C[i-1,j-1];
②:当 Xi != Yi 时,则C[i,j]=Min{C[i-1,j-1],C[i-1,j],C[i,j-1]}+1;
最终我们的C[i,j]一直保存着最小的LD。
#include<stdio.h>
int LD(char*A,char*B,inti,intj)
{
if (i == -1)
{
if (j >= 0)
returnj + 1;
else
return 0;
}
if (j == -1)
returni + 1;
if (A[i] == B[j])
return LD(A,B,i - 1,j - 1);
if (A[i] != B[j])
{
int modifyLD = LD(A,B,i - 1, j - 1);
int insertLD = LD(A,B,i - 1,j);
int deleteLD = LD(A,B,i,j - 1);
if (modifyLD <= insertLD)
{
if (modifyLD <= deleteLD)
return modifyLD+1;
return deleteLD+1;
}
if (insertLD <= deleteLD)
return insertLD+1;
return deleteLD+1;
}
}
void main()
{
char A[50] ="fabcdxsxsss";
char B[50] ="fbcdefdxsxscxc";
printf("%d",LD(A,B,strlen(A),strlen(B)));
fflush(stdout);
}
只要你能通过找规律手工填写出上面这张表就算理解了01背包的动态规划算法。
首先要明确这张表是至底向上,从左到右生成的。
为了叙述方便,用e2单元格表示e行2列的单元格,这个单元格的意义是用来表示只有物品e时,有个承重为2的背包,那么这个背包的最大价值是0,因为e物品的重量是4,背包装不了。
对于d2单元格,表示只有物品e,d时,承重为2的背包,所能装入的最大价值,仍然是0,因为物品e,d都不是这个背包能装的。
同理,c2=0,b2=3,a2=6。
对于承重为8的背包,a8=15,是怎么得出的呢?
根据01背包的状态转换方程,需要考察两个值,
一个是f[i-1,j],对于这个例子来说就是b8的值9,另一个是f[i-1,j-Wi]+Pi;
在这里,
f[i-1,j]表示我有一个承重为8的背包,当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值
f[i-1,j-Wi]表示我有一个承重为6的背包(等于当前背包承重减去物品a的重量),当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值
f[i-1,j-Wi]就是指单元格b6,值为9,Pi指的是a物品的价值,即6
由于f[i-1,j-Wi]+Pi = 9 + 6 = 15 大于f[i-1,j] = 9,所以物品a应该放入承重为8的背包
import java.util.ArrayList;
import java.util.List;
publicclass test1{
private List<int[]>list =new ArrayList<int[]>();
privateintweight = 0;
public test1(List<int[]>list,int weight){
this.list = list;
this.weight = weight;
}
publicint getMaxValue(){
return maxValue(list.size(),weight);
}
publicint maxValue(int num,int w){
if(num==1){
if(list.get(num-1)[0]<=w)
returnlist.get(num-1)[1];
else
return 0;
}
if(list.get(num-1)[0]<=w){
return ((maxValue(num-1,w-list.get(num-1)[0])+list.get(num-1)[1])>maxValue(num-1, w))?
(maxValue(num-1,w-list.get(num-1)[0])+list.get(num-1)[1]):maxValue(num-1, w);
}
return maxValue(num-1, w);
}
publicstaticvoid main(String[]args){
List<int[]>list = new ArrayList<int[]>();
int weight = 10;
list.add(newint[]{2,6});
list.add(newint[]{2,3});
list.add(newint[]{6,5});
list.add(newint[]{5,4});
list.add(newint[]{4,6});
test1 test =new test1(list, weight);
System.out.println(test.getMaxValue());
}
}
装配线调度
矩阵连乘
整齐打印
瓷砖覆盖问题
- 动态规划!!!动态规划!!!
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- iOS runtime访问/修改私有变量
- 分布式系统生成唯一主键
- 【大创_社区划分】——PageRank算法的解析与Python实现
- HBuilder app开发:mask遮罩实现父子页面联动。
- centos-apache-tomcat-domain配置
- 动态规划
- [Leetcode]Merge Two Sorted Lists
- Android编码规范
- Android5.0: JNI DETECTED ERROR IN APPLICATION
- 不同方式调用webservice接口
- ios字体相关
- 深搜——n皇后问题
- 关于关于Linux 系统中 oracle lsnrctl 无法启动问题
- WDK开发环境