动态规划算法作业Word文档格式.docx
- 文档编号:19437717
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:17
- 大小:93.27KB
动态规划算法作业Word文档格式.docx
《动态规划算法作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《动态规划算法作业Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
算法复杂性为
。
算法分析3-4
考虑下面的整数线性规划问题
设计一个解此问题的动态规划算法,并分析算法的计算复杂性
分析;
这题是01背包问题的变种,只不过同一种物品可以重复多次放入背包(无件数限制),即所谓完全背包问题。
wi对应第i件物品重量,vi对应第i件物品价值。
从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。
状态转移方程:
f[v]=max{f[v-k*c]+k*w},其中0<
=k*c<
=v。
完全背包问题有一个很简单有效的优化:
若两件物品i、j满足c<
=c[j]且w>
=w[j],则将物品j去掉,不用考虑。
由于有O(N*V)个状态需要求解,求解每个状态的时间则不是常数了,求解状态f[v]的时间是O(v/c),,但是由于每件物品都可能取多件,总的复杂度就超过O(VN)了。
算法分析3-7
给定一个m×
n的矩形网络,设其左上角为起点S。
一辆汽车从起点S出发驶向右下角终点T。
网格边上的数字表示距离。
在若干个网格点处设置了障碍,表示该网格点不可到达。
试设计一个算法,求出汽车从起点S出发到达终点T的一条行驶路程最短的路线。
用一个集合R放置最短路径的所有网格点共m*n个。
点集合中的点有其对应坐标原点(0,0)的横纵坐标x,y属性。
用一个集合T记录所有边,边集合中的边有其边长和所连接的两点,
对于mXn的矩行网络,有横向边(m+1)*n条,纵向边m*(n+1)条,。
将所有边放入T集合,然后遍历去掉所有直接链接不可达点的边。
剩下的就是一张可达的网格图,对于起点S和终点T,从S开始,可以采用图论的Dijkstra算法更新S到每个点的距离d。
(用距离记录集合M记录S到每个点的距离。
)
d(u)=min(d(u),d(vk+1)+w(vk+1->
u)).(u与vk+1相邻)
也可以直接将不可达点的连接边长设置为无穷大,然后代入Dijkstra算法。
算法实现题3-5
编辑距离问题
问题描述:
设A和B是两个字符串。
要用最少的字符操作将字符串A转换为字符串B。
这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符
将字符串A变换为字符串B所用的最少字符操作数成为字符串A到B的编辑距离,记为d(A,B).试设计一个有效算法,对任给的2个字符串A和B,计算他们的编辑距离d(A,B).
算法设计:
对给定的字符串A和B,计算其编辑距离d(A,B).
数据输入:
由文件input.txt提供输入数据。
文件的第一行是字符串A,文件的第二行是字符串B。
结果输出:
将编辑距离d(A,B)输出到output.txt的第1行
程序代码
#include<
iostream>
string.h>
usingnamespacestd;
//Globalvariables
int**tab;
intm=0;
intn=0;
//functiondeclare
voidinit();
voidfree();
intd(char*str1,char*str2);
intmain()
{
char*A="
sef"
;
char*B="
asesfe"
//cout<
<
A<
"
和"
B<
距离为"
d(A,B)<
endl;
/*文件输入处理部分,可以去掉这一部分直接只测A和B距离*/
/*文件输出处理部分,可以去掉这一部分不输出文件*/
FILE*fp;
FILE*fp2;
charAF[100];
charBF[100];
constchar*BP=BF;
if((fp=fopen("
input.txt"
"
r"
))==NULL)
return0;
if((fp2=fopen("
output.txt"
w"
if(!
fscanf(fp,"
%s"
AF))cout<
invalidfileinput!
while(fscanf(fp,"
BF)==1){
BF"
BF<
cout<
AF<
BF<
d(AF,BF)<
fprintf(fp2,"
%s和%s距离为%d\n"
AF,BF,d(AF,BF));
memcpy(AF,BP,strlen(BF));
}
if(fclose(fp)!
=0)
/**/
if(fclose(fp2)!
system("
pause"
);
voidinit()
//cin>
>
m;
n;
//malloc
tab=newint*[m];
for(inti=0;
i<
i++)
tab[i]=newint[n];
//init
i++){
for(intj=0;
j<
j++){
tab[i][j]=0;
tab[i][0]=i;
j++)
tab[0][j]=j;
//returntrue;
voidfree()
deletetab[i];
delete[]tab;
intd(char*str1,char*str2)
m=strlen(str1);
n=strlen(str2);
m<
n<
if(m==0||n==0){
returnm>
n?
m:
init();
intcost=0;
for(inti=1;
for(intj=1;
//计算替换操作的代价,如果两个字符相同,则替换代价为0,否则为1
if(str1[i]==str2[j])
cost=0;
elsecost=1;
if(tab[i-1][j]<
tab[i][j-1]&
tab[i-1][j]+1<
tab[i-1][j-1]+cost)
tab[i][j]=tab[i-1][j]+1;
elseif(tab[i][j-1]+1<
{
tab[i][j]=tab[i][j-1]+1;
else{
tab[i][j]=tab[i-1][j-1]+cost;
}
intresult=tab[m-1][n-1];
free();
returnresult;
运行举例
input文件如下(为方便测试我采取的输入格式是连续的字符串,让它们依次与前一个字符串比较并输出结果)
01背包问题
程序为ppt算法的实现
1基本算法
/**
*authorwd
*title01背包(algorithmisfromcourseppt)
*time2011-5-115:
41:
09
*/
#include<
//globalenvirenmentvariables
int*w;
int*v;
intnum=0;
bool*x;
typedefstructPoint
intx;
inty;
}point;
//function
intm(inti,intj)//x[i]is0or1
if(i>
num-1)return0;
if(j>
=w[i]){
if(i==num-1){returnv[i];
intm1=m(i+1,j);
intm2=m(i+1,j-w[i])+v[i];
if(m1>
m2){
returnm1;
returnm2;
elseif(j>
0&
w[i]){
returnm(i+1,j);
elseif(j==0)
errorinput!
pleasecheck."
<
endl;
inputweight:
num;
{cin>
w[i];
x[i]=0;
fflush(stdin);
inputvalue:
v[i];
}
intmain(){
pointa;
while
(1){
intcapacity,max_value=0;
inputthenumberofitem(num)andcapacityofpackage(capacity):
cin>
num;
capacity;
w=(int*)malloc(sizeof(int)*(num+1));
v=(int*)malloc(sizeof(int)*(num+1));
x=(bool*)malloc(sizeof(bool)*(num+1));
//signiftheobjectisselected
inti=0;
max_value=m(i,capacity);
"
thehighesttotalvalueis:
max_value<
free(w);
free(v);
free(x);
运行截图
2改进算法
vector>
//globalvariales
intcapacity=0;
intmax_value=0;
typedefvector<
point>
vp;
voidshow_vp(vpp);
voidcombine_(vp&
p,pointkey,vp&
q);
voidunion_(vp&
p,vp&
q,vp&
r);
voidshow_result(vpr);
voidfree_();
vector<
p;
q;
r;
inti;
pointstartp;
startp.x=0;
startp.y=0;
pointpi;
/*while(i>
0){*/
p.push_back(startp);
/*i--;
}*/
for(i=num-1;
i>
=0;
i--){
pi.x=w[i];
pi.y=v[i];
combine_(p,pi,q);
//makeq
union_(p,q,r);
//makenextp
p=r;
//可以拷贝赋值
show_result(r);
free_();
//sothelastpoint'
syvalueiswhatwewantnamelythebestvalue
q)
q.clear();
for(vp:
:
iteratori=p.begin();
p.end();
(*i).x<
pointtemp;
temp.x=(*i).x+key.x;
temp.y=(*i).y+key.y;
if(temp.x>
capacity);
else
q.push_back(temp);
qisnow"
show_vp(q);
r){
r.clear();
vp:
iteratorj=q.begin();
while(i<
p.end()||j<
q.end())//双循环并行
=p.end()){
while(j<
q.end()){
temp.x=(*j).x;
temp.y=(*j).y;
r.push_back(temp);
j++;
=q.end()){
p.end()){
temp.x=(*i).x;
temp.y=(*i).y;
i++;
else{
if((*i).x<
(*j).x)
elseif((*i).x==(*j).x)
{
if((*i).y==(*j).y)
else//x相等的统统跳过,记录一个就行
if((*i).y>
(*j).y){
j++;
//removeall(a,b)thata>
=cbutb<
dfromresult
i=r.begin();
pisnow"
show_vp(r);
while((i+1)!
=r.end()){
(*(i+1)).y)
r.erase(i+1);
elsei++;
voidshow_vp(vpp)
intc=0;
++c<
("
(*i).y<
)"
voidshow_result(vpr)
iteratori;
i=r.end()-1;
cout<
voidfree_()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 规划 算法 作业