C语言经典的动态规划题目源程序和解释(c语言)动态规划定义等……越仔细分越高我只是初二的,像NOIP竞赛题,“采药”、“
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/12 03:01:00
C语言
经典的动态规划题目
源程序和解释(c语言)
动态规划定义等……
越仔细分越高
我只是初二的,
像NOIP竞赛题,“采药”、“开心的金明”……
经典的动态规划题目
源程序和解释(c语言)
动态规划定义等……
越仔细分越高
我只是初二的,
像NOIP竞赛题,“采药”、“开心的金明”……
这是我们计算机系算法设计课的实验课程,下面是动态规划内容:
实验四:动态规划
实验目的:理解动态规划的基本思想,理解动态规划算法的两个基本要素最优子结构性质和子问题的重叠性质.熟练掌握典型的动态规划问题.掌握动态规划思想分析问题的一般方法,对较简单的问题能正确分析,设计出动态规划算法,并能快速编程实现.
实验内容:编程实现讲过的例题:最长公共子序列问题、矩阵连乘问题、凸多边形最优三角剖分问题、电路布线问题等.本实验中的问题,设计出算法并编程实现.
习题
1. 最长公共子序列
一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,…,k有
a) 最长公共子序列的结构
若用穷举搜索法,耗时太长,算法需要指数时间.
易证最长公共子序列问题也有最优子结构性质
设序列X=和Y=的一个最长公共子序列Z=,则:
i.若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
ii.若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
iii.若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列.
其中Xm-1=,Yn-1=,Zk-1=.
最长公共子序列问题具有最优子结构性质.
b) 子问题的递归结构
由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列.当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列.这两个公共子序列中较长者即为X和Y的一个最长公共子序列.
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质.例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列.而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列.
我们来建立子问题的最优值的递归关系.用c[i,j]记录序列Xi和Yj的最长公共子序列的长度.其中Xi=,Yj=.当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故c[i,j]=0.建立递归关系如下:
c) 计算最优值
由于在所考虑的子问题空间中,总共只有θ(m*n)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率.
计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=和Y=作为输入.输出两个数组c[0..m ,0..n]和b[1..m ,1..n].其中c[i,j]存储Xi与Yj的最长公共子序列的长度,b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的,这在构造最长公共子序列时要用到.最后,X和Y的最长公共子序列的长度记录于c[m,n]中.
程序如下:
#include
#include
int lcs_length(char x[],char y[]);
int main()
{
char x[100],y[100];
int len;
while(1)
{
scanf("%s%s",x,y);
if(x[0]=='0') //约定第一个字符串以‘0’开始表示结束
break;
len=lcs_length(x,y);
printf("%d\n",len);
}
}
int lcs_length(char x[],char y[] )
{
int m,n,i,j,l[100][100];
m=strlen(x);
n=strlen(y);
for(i=0;i
实验四:动态规划
实验目的:理解动态规划的基本思想,理解动态规划算法的两个基本要素最优子结构性质和子问题的重叠性质.熟练掌握典型的动态规划问题.掌握动态规划思想分析问题的一般方法,对较简单的问题能正确分析,设计出动态规划算法,并能快速编程实现.
实验内容:编程实现讲过的例题:最长公共子序列问题、矩阵连乘问题、凸多边形最优三角剖分问题、电路布线问题等.本实验中的问题,设计出算法并编程实现.
习题
1. 最长公共子序列
一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,…,k有
a) 最长公共子序列的结构
若用穷举搜索法,耗时太长,算法需要指数时间.
易证最长公共子序列问题也有最优子结构性质
设序列X=和Y=的一个最长公共子序列Z=,则:
i.若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
ii.若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
iii.若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列.
其中Xm-1=,Yn-1=,Zk-1=.
最长公共子序列问题具有最优子结构性质.
b) 子问题的递归结构
由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列.当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列.这两个公共子序列中较长者即为X和Y的一个最长公共子序列.
由此递归结构容易看到最长公共子序列问题具有子问题重叠性质.例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列.而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列.
我们来建立子问题的最优值的递归关系.用c[i,j]记录序列Xi和Yj的最长公共子序列的长度.其中Xi=,Yj=.当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故c[i,j]=0.建立递归关系如下:
c) 计算最优值
由于在所考虑的子问题空间中,总共只有θ(m*n)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率.
计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=和Y=作为输入.输出两个数组c[0..m ,0..n]和b[1..m ,1..n].其中c[i,j]存储Xi与Yj的最长公共子序列的长度,b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的,这在构造最长公共子序列时要用到.最后,X和Y的最长公共子序列的长度记录于c[m,n]中.
程序如下:
#include
#include
int lcs_length(char x[],char y[]);
int main()
{
char x[100],y[100];
int len;
while(1)
{
scanf("%s%s",x,y);
if(x[0]=='0') //约定第一个字符串以‘0’开始表示结束
break;
len=lcs_length(x,y);
printf("%d\n",len);
}
}
int lcs_length(char x[],char y[] )
{
int m,n,i,j,l[100][100];
m=strlen(x);
n=strlen(y);
for(i=0;i
C语言经典的动态规划题目源程序和解释(c语言)动态规划定义等……越仔细分越高我只是初二的,像NOIP竞赛题,“采药”、“
c语言 数字三角形的动态规划
2.最后的战场(动态规划)pascal (war.pas/c/cpp)
C语言动态规划乘积最大(cjzd)设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得
一道C语言动态规划题描述 假设有一张n*n个方格的棋盘以及一个棋子.必须根据以下的规则把棋子从棋盘的底边移动到棋盘的顶边
C语言-动态规划某个化学实验室可用三套不同的仪器中任意一套去完成.在做完一次实验之后,如果下次仍用原用的那套仪器,则必须
数学建模中规划的分类时常有什么线性规划和非线性规划 动态规划 非动态规划 多目标规划 单目标规划 到底该怎么具体的给数学
数据结构C语言括号的检验源程序
求动态规划0/1背包问题的经典习题及测试数据
动态规划算法
我想问一下,noip普及组复赛常考的题型大概有哪几类?还有如果考动态规划,大概是什么难度?还有复赛可以带U盘吗?
动态规划的0-1背包问题,请高手解释下代码