算法设计与分析笔记-动态规划

这篇博客探讨了动态规划在解决基因序列比对问题中的应用,详细阐述了动态规划的步骤、特征和基本要素。通过矩阵连乘、最长公共子序列以及0-1背包问题等例子进行说明,并介绍了如何利用map数组简化基因字符转换,以及如何实施动态规划算法计算基因子串的分值。最后,给出了边界条件的处理方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
动态规划的步骤:
在这里插入图片描述
动态规划的特征:
在这里插入图片描述
矩阵连乘:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#define NUM 51
int p[NUM];
int m[NUM][NUM];
int s[NUM][NUM];
void MatrixChain (int n)
{
   
  for (int i=1;  i<=n;  i++) m[i][i] = 0;
  for (int r=2;  r<=n;  r++)
	for (int i=1;  i<=n-r+1;  i++) 
	{
   
	  int j=i+r-1; 
	  //计算初值,从i处断开
	  m[i][j] = m[i+1][j]+p[i-1]*p[i]*p[j];
	  s[i][j] = i; 
	  for (int k=i+1;  k<j;  k++) 
	  {
    
		int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
		if (t < m[i][j]) {
   m[i][j] = t; s[i][j] = k;}
	  }
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法4.2计算矩阵连乘积最优解的递归算法
void TraceBack(int i, int j) 
{
    
	if(i==j) printf("A%d", i);
	else 
	{
   
		printf("(");
		TraceBack(i,s[i][j]); 
		TraceBack(s[i][j]+1,j); 
		printf(")"); 
	}
}

动态规划算法的基本要素:
在这里插入图片描述
在这里插入图片描述

算法4.3  计算矩阵连乘积的递归算法

int Recurve(int i, int j)
{
   
  if (i == j) return 0;
  int u = Recurve(i, i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值