程序设计思维与实践 Week10 B - LIS & LCS

本文深入探讨了两种关键的序列算法——最长上升子序列与最长公共子序列。详细讲解了各自的定义、状态转移方程及其实现代码,为理解序列算法提供了清晰的路径。

题意:

在这里插入图片描述
input:

在这里插入图片描述
output:

在这里插入图片描述
思路:

1、最长上升子序列,对于给定的一串数,定义f[i]为以A[i]结尾的长度。转移方程为fi=max{fj | j<i && Aj<Ai}+1。首先将第一个数的长度赋为1,从第一个数开始遍历,到第i个数的时候,遍历 j 为0到i-1的数,其中A[j]要比当前的A[i]小,才能接上去,找到在这其中的已有的最大的f[j],将f[i]接上去,并加1,即可得到最大的。复杂度n^2.

2、最长公共子序列,对于给定的两串数,设f[i][j]为A[]数组遍历到i,B[]数组遍历到j的时候,其两个的相同的数。
首先初始化f[i][0],f[0][j], f[0][0],都为0。易知,其不会有相同的数。
状态转移:即对当前的A[i]和B[i],如果相等,则已有的数加1,并计算其f[i-1][j-1]的个数,并加上1。若不相等,则其中的一个回退1,并取两个回退的最大值,即
f[i][j]=max(f[i-1][]j,f[i][]j-1);即为枚举其中一个数组的数,然后遍历另外一个数组的数,来求得最大的数。
综上,转移方程为:A[i]==B[j] : f[i][j]=f[i-1][j-1]+1;
else: f[i][j]=max(f[i-1][]j,f[i][]j-1)。

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

int n, m;
long long A[5010], B[5010];
long long f1[5010]; //记录最长上升子序列
long long f[5010][5010];

long long ans1=0;

int main() {
	ios::sync_with_stdio(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> A[i];
	}
	for(int i=1; i<=m; i++){
		cin>>B[i];	
	}
	memset(f1, 0, sizeof(f1));
	memset(f, 0, sizeof(f));
	f1[1] = 1;
	
	for (int i = 1; i <= n; i++) {
		long long m1 = 0;
		for (int j = 1; j < i; j++) {
			if (A[j] < A[i]) m1 =max(m1,f1[j]);
		}
		f1[i]=m1+1;
		ans1 = max(ans1,f1[i]);
	}	
	
	for(int i=1; i<=n;i++){
		for(int j=1;j<=m;j++){
			if(A[i]==B[j]) f[i][j]=f[i-1][j-1]+1;
			else f[i][j]=max(f[i-1][j],f[i][j-1]);
		}
	}
	cout<<ans1<<" "<<f[n][m]<<endl;
	
	return 0;

}
课程设计报告:总体方案设计说明 一、软件开发环境配置 本系统采用C++作为核心编程语言,结合Qt 5.12.7框架进行图形用户界面开发。数据库管理系统选用MySQL,用于存储用户数据小精灵信息。集成开发环境为Qt Creator,操作系统平台为Windows 10。 二、窗口界面架构设计 系统界面由多个功能模块构成,各模块职责明确,具体如下: 1. 起始界面模块(Widget) 作为应用程序的入口界面,提供初始导航功能。 2. 身份验证模块(Login) 负责处理用户登录账户注册流程,实现身份认证机制。 3. 游戏主大厅模块(Lobby) 作为用户登录后的核心交互区域,集成各项功能入口。 4. 资源管理模块(BagWidget) 展示用户持有的全部小精灵资产,提供可视化资源管理界面。 5. 精灵详情模块(SpiritInfo) 呈现选定小精灵的完整属性数据状态信息。 6. 用户名录模块(UserList) 系统内所有注册用户的基本信息列表展示界面。 7. 个人资料模块(UserInfo) 显示当前用户的详细账户资料历史数据统计。 8. 服务器精灵选择模块(Choose) 对战准备阶段,从服务器可用精灵池中选取参战单位的专用界面。 9. 玩家精灵选择模块(Choose2) 对战准备阶段,从玩家自有精灵库中筛选参战单位的操作界面。 10. 对战演算模块(FightWidget) 实时模拟精灵对战过程,动态呈现战斗动画状态变化。 11. 对战结算模块(ResultWidget) 对战结束后,系统生成并展示战斗结果报告数据统计。 各模块通过统一的事件驱动机制实现数据通信状态同步,确保系统功能的连贯性数据一致性。界面布局遵循模块化设计原则,采用响应式视觉方案适配不同显示环境。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值