最长公共子序列求最优值和最优解递归算法

 

代码部分:

#include<iostream>
using namespace std;

char X[100];//存放X序列的数组
char Y[100];//存放Y序列
int c[100][100];//存放公共子序列个数的二维表
int b[100][100];//存放标志位,用来后面找最优解的二维表

int lcs_length(int m, int n)
{

	for (int i = 1; i <= m; i++)   c[i][0] = 0;//当某一个序列为0时也要赋值0
	for (int j = 1; j <= m; j++)   c[0][j] = 0;

	for (int i = 1; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (X[i] == Y[j])
			{
				c[i][j] = c[i - 1][j - 1] + 1; b[i][j] = 1;//序列相等的时候,将左上方的数值+1赋值给此位置,代表相等的序列个数又多了一个,此外b数组记录下来,用1代替符号↖
			}
			else
				if (c[i - 1][j] >= c[i][j - 1])
				{
					c[i][j] = c[i - 1][j]; b[i][j] = 2;//如果此位置上面的数字比这个位置左边的数字大,就把上面的值赋给这个位置,此外用↑来记录数值的来源
				}
				else
				{
					c[i][j] = c[i][j - 1]; b[i][j] = 3;//如果此位置上面的数字比这个位置左边的数小,就把左边的值赋给这个位置,此外用←记录数值的来源
				}
		}
	}

	return c[m][n];//左下角这个位置记录了这两个序列最长相等序列的长度
}


void lcs(int i, int j, char X[100])
{
	if ((i == 0) || (j == 0))
		return;//递归出口
	if (b[i][j] == 1)
	{
		lcs(i - 1, j - 1, X);
		cout << X[i];//如果这个位置有相等序列,则这个位置的数值来源肯定是用↖标记的,输出此位置的序列值
	}
	else
		if (b[i][j] == 2)
			lcs(i - 1, j, X);
		else
			lcs(i, j - 1, X);

}


int main()
{
	int m;
	int n;

	cout << "请输入X序列的个数: ";
	cin >> m;

	cout << "请输入Y序列的个数: ";
	cin >> n;

	cout << "请输入X序列:";
	for (int i = 1; i <= m; i++)
	{
		cin >> X[i];
	}

	cout << "请输入Y序列:";
	for (int j = 1; j <= n; j++)
	{
		cin >> Y[j];
	}

	lcs_length(m, n);

	int L = lcs_length(m, n);

	for (int i = 0; i <= m; i++)                //输出c数组
	{
		for (int j = 0; j <= n; j++)
		{
			cout << c[i][j] << ' ';
		}
		cout << endl;
	}

	cout << "最长公共子序列的长度为: " << L << endl;

	cout << "最长公共子序列为:";

	lcs(m, n, X);

	cout << endl;
	return 0;
}

结果演示:                                                                                                                                                    

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,粒子群算法是一种智能算法,可以用于解最大问题。下面是一个使用C语言实现粒子群算法解最大的例子: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define N 30 // 粒子数 #define D 2 // 搜索空间维度 #define MAX_GEN 500 // 最大迭代次数 #define c1 2 // 学习因子1 #define c2 2 // 学习因子2 #define w 0.8 // 惯性权重 // 定义粒子结构体 typedef struct { double x[D]; // 粒子位置 double v[D]; // 粒子速度 double p[D]; // 粒子历史最优位置 double fitness; // 粒子历史最优适应度 } Particle; // 目标函数,这里以Rastrigin函数为例 double Rastrigin(double x[], int dim) { double sum = 0.0; for (int i = 0; i < dim; i++) { sum += x[i] * x[i] - 10.0 * cos(2.0 * M_PI * x[i]) + 10.0; } return sum; } // 初始化粒子群 void init(Particle swarm[]) { srand((unsigned int)time(NULL)); for (int i = 0; i < N; i++) { for (int j = 0; j < D; j++) { swarm[i].x[j] = (double)rand() / RAND_MAX * 10.0 - 5.0; // 初始化粒子位置 swarm[i].v[j] = (double)rand() / RAND_MAX * 2.0 - 1.0; // 初始化粒子速度 } for (int j = 0; j < D; j++) { swarm[i].p[j] = swarm[i].x[j]; // 初始化粒子历史最优位置 } swarm[i].fitness = Rastrigin(swarm[i].x, D); // 计算粒子历史最优适应度 } } // 更新粒子速度和位置 void update(Particle swarm[], double gbest[]) { for (int i = 0; i < N; i++) { for (int j = 0; j < D; j++) { double r1 = (double)rand() / RAND_MAX; double r2 = (double)rand() / RAND_MAX; swarm[i].v[j] = w * swarm[i].v[j] + c1 * r1 * (swarm[i].p[j] - swarm[i].x[j]) + c2 * r2 * (gbest[j] - swarm[i].x[j]); // 更新粒子速度 swarm[i].x[j] += swarm[i].v[j]; // 更新粒子位置 } double fitness = Rastrigin(swarm[i].x, D); if (fitness < swarm[i].fitness) { // 更新粒子历史最优位置和适应度 swarm[i].fitness = fitness; for (int j = 0; j < D; j++) { swarm[i].p[j] = swarm[i].x[j]; } } } } // 获取全局最优解 void get_gbest(Particle swarm[], double gbest[]) { int best = 0; for (int i = 1; i < N; i++) { if (swarm[i].fitness < swarm[best].fitness) { best = i; } } for (int i = 0; i < D; i++) { gbest[i] = swarm[best].p[i]; } } // 粒子群算法解最大 void PSO() { Particle swarm[N]; // 粒子群 double gbest[D]; // 全局最优解 init(swarm); // 初始化粒子群 get_gbest(swarm, gbest); // 获取全局最优解 for (int i = 0; i < MAX_GEN; i++) { update(swarm, gbest); // 更新粒子速度和位置 get_gbest(swarm, gbest); // 获取全局最优解 } printf("Max value of Rastrigin function: %f\n", -swarm[0].fitness); // 输出最大 } int main() { PSO(); // 粒子群算法解最大 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值