K M P 算法模板

本文介绍了一道关于如何从花布条中剪出最多小饰条的题目,该问题可以通过KMP算法高效解决。文章提供了KMP算法的详细解释,并给出了一段C++代码实现。在样例中,当输入特定的花布条和小饰条时,程序能够计算出最多可以剪出的小饰条数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目引入:

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 

Input

输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 

Output

输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。

2.样例输出: 

Sample Input

abcde a3
aaaaaa  aa
#

Sample Output

0
3

本题是一道标准的 kmp 算法题, 如果我们将两个串的字符进行一个遍历比较,那么它的时间复杂度是非常大的(最差时将达到 O(m*n)),这无疑是非常糟糕的,所以我们引入了 kmp 算法,这里有大神的解释(的确很详细不懂的可以看一下) 下面我们来看一怎么实现的吧。https://blog.youkuaiyun.com/weixin_46007276/category_9703070.html

3.代码如下: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e3+10;
string s="",s1="";
int next1[maxn],t1,t2;
void dfs()
{
	int i=0,j=-1;
	next1[0]=-1;
	while(i<t2)
	{
		if(j==-1||s1[i]==s1[j])
		{
			i++;
			j++;
			next1[i]=j;  // 下标为 i 以前的字符串最长前后缀 
		}
		else
		{
			j=next1[j];  // 没有匹配 
		}
	}
}
int kmp()
{
	int i=0,j=0,ans=0; // 记得第二个 j 下标从 0 开始 
	dfs();
	while(i<t1)
	{
		if(j==-1||s[i]==s1[j])  // 如果 j 没有移动  
		{
			i++;
			j++;     // 因为是两个不同的字符串所以没有 next1[i]=j;这一步骤 
		}
		else
		{
			j=next1[j];
		}
		if(j==t2)  // 这里 i 记录字符串 s 的长度而 j 记录的是 字符串 s1 的长度 
		{
			ans++;   // 当达到字符串s1的长度进行 ++就行 
			j=0; // 然后让 s1 的下标从 0 开始 
		}
	}
	return ans;  
}
int main()
{
	while(cin>>s)
	{
		if(s[0]=='#') break;
		cin>>s1;
		t1=s.length();
		t2=s1.length();
		cout<<kmp()<<"\n";
	}
}
### NMPC算法的Python实现 对于非线性模型预测控制(NMPC),其实现涉及到多个方面,包括但不限于建立动态系统的数学模型、设定目标函数以及约束条件,并采用合适的数值优化方法来求解最优控制序列。为了便于理解和应用,在此提供一段简化版的NMPC框架代码示例[^1]。 ```python import numpy as np from scipy.optimize import minimize class NMPCController: def __init__(self, model_func, horizon_length, constraints=None): """ 初始化NMPC控制器 参数: model_func (callable): 动态系统模型函数 f(x,u),返回下一时刻的状态向量. horizon_length (int): 预测时间范围内的步数. constraints (dict or list of tuples): 控制变量上下限或其他形式的约束. """ self.model = model_func self.N = horizon_length if isinstance(constraints, dict): self.constraints = [{'type': 'ineq', 'fun': lambda u: u[i] - constraints['ub'][i]} for i in range(len(u))] + \ [{'type': 'ineq', 'fun': lambda u: -u[i] + constraints['lb'][i]} for i in range(len(u))] elif isinstance(constraints, list): self.constraints = constraints def cost_function(self, U, X0, ref_trajectory): """ 定义代价函数 J(U|X0) """ total_cost = 0 current_state = X0.copy() for k in range(self.N): control_input = U[k * len(X0):(k+1)*len(X0)] # 计算下一个状态 next_state = self.model(current_state, control_input) # 基于跟踪误差计算阶段成本 error = next_state - ref_trajectory[:,k] stage_cost = np.dot(error.T, error).sum() total_cost += stage_cost current_state[:] = next_state[:] return total_cost def solve_optimization_problem(self, initial_guess, x_init, reference_traj): res = minimize( fun=self.cost_function, x0=initial_guess.flatten(), args=(x_init, reference_traj), method='SLSQP', bounds=[(-np.inf,np.inf)]*len(initial_guess), constraints=self.constraints ) return res.x.reshape((-1,len(x_init))) ``` 上述代码展示了如何构建一个简单的NMPC类`NMPCController`,其中包含了设置模型方程、定义代价函数和调用SciPy库中的minimize()来进行最优化求解的过程。需要注意的是这只是一个基础模板,实际应用场景下可能还需要考虑更多细节,比如处理噪声干扰、改进收敛速度等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风遥~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值