双序列动态规划
双序列动态规划
状态定义
往往是
状态转移
往往是与
例
P1140
正解
暴力
若
否则与空串
其中
求解目标
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+t[g(a[i])][g('-')];
}
f[0][0]=0;
for(int i=1;i<=m;i++){
f[0][i]=f[0][i-1]+t[g(b[i])][g('-')];
f[i][0]=f[i-1][0]+t[g(a[i])][g('-')];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
/*
f[i][j]=f[i][j-1]+t[g(b[j])][g('-')];
for(int k=i;k;k--){
f[i][j]=max(f[i][j],f[k-1][j-1]+t[g(a[k])][g(b[j])]+sum[i]-sum[k]);
}
*/
f[i][j]=max(f[i-1][j-1]+t[g(a[i])][g(b[j])],max(f[i-1][j]+t[g(a[i])][g('-')],f[i][j-1]+t[g(b[j])][g('-')]));
}
}
P1439
如果
否则
求解目标
P2758
如果
否则
求解目标
for(int i=0;i<=n;i++)f[i][0]=i;
for(int i=0;i<=m;i++)f[0][i]=i;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j]=min(f[i][j],f[i-1][j]+1);
f[i][j]=min(f[i][j],f[i][j-1]+1);
f[i][j]=min(f[i][j],f[i-1][j-1]+1);
if(a[i]==b[j])f[i][j]=min(f[i][j],f[i-1][j-1]);
}
}
P2679
若不选
若选
所以
优化:
令
显然,若
否则
省略第一维
求解目标
注意取模
for(int i=0;i<=n;i++){
f[0][0]=1;
}
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
for(int k=K;k>=1;k--){
if(a[i]==b[j])sum[j][k]=(sum[j-1][k]+f[j-1][k-1])%mod;
else sum[j][k]=0;
f[j][k]=(f[j][k]+sum[j][k])%mod;
}
}
}
acwing30
如果b[j]为正常字符或
如果为
复制
否则,
初始化
求解目标
class Solution {
public:
vector<vector<int> >f;
int n,m;
bool isMatch(string s, string p) {
n=s.length(),m=p.length();
f=vector<vector<int> >(n+1,vector<int>(m+1,-1));
f[n][m]=1;
return dp(0,0,s,p);
}
int dp(int i,int j,string &s,string &p){
if(f[i][j]!=-1)return f[i][j];
if(j==m){
return f[i][j]=(i==n);
}
bool mat=(i<n&&(s[i]==p[j]||p[j]=='.'));
bool ans=0;
if(j+1<m&&p[j+1]=='*'){
ans=dp(i,j+2,s,p)||(mat&&dp(i+1,j,s,p));
}else{
ans=mat&&dp(i+1,j+1,s,p);
}
return f[i][j]=ans;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南