题解:P12129 [蓝桥杯 2024 省 B 第二场] 遗迹(加强版)
前情提要:由于两个字符串数组大小写反,硬控我半个小时。
考虑动态规划。
我们设一个状态
那该怎么转移呢?
对于一个位置
所以我们就可以写出动态转移方程:
虽然这样子的时间复杂度是
代码部分:
// dp数组用滚动数组优化内存
//如果无法到达,就用无穷大来代替这个状态
//minx就是充当单调栈的作用
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+1,M=1e5+1;
int n,m,L,dp[2][N],tot,ans;
char s[N],t[M];
signed main()
{
scanf("%lld%lld%lld\n%s\n%s",&n,&m,&L,s+1,t+1);
for(register int i=1;i<=m;i++)
{
int tott=tot^1,mini=1ll<<31,minx=1ll<<31;
memset(dp[tott],127/3,sizeof(dp[tott]));
for(int j=1;j<=n;j++)
{
minx=min(minx,dp[tot][j]);
if(s[j]==t[i])
{
dp[tott][j]=min(dp[tott][j],minx);
mini=min(mini,dp[tott][j]);
}
minx++;
}
for(int j=n;j>=1;j--)
{
minx=min(minx,dp[tot][j]);
if(s[j]==t[i])
{
dp[tott][j]=min(dp[tott][j],minx);
mini=min(mini,dp[tott][j]);
}
minx++;
}
tot=tott;
if(mini<=L) ans=i;
else break;
}
printf("%lld",ans);
return 0;
}
如有更优做法,欢迎提供。