题目

分析
dp
状态转移方程:
f [ i ] f[i] f[i]表示加密后的单词 1 − i 1-i 1−i的最小代价
f [ i ] = min ( f [ i ] , f [ i − l e n [ j ] ] + w ) f[i]=\min(f[i],f[i-len[j]]+w) f[i]=min(f[i],f[i−len[j]]+w)
代码
#include <cstdio>
#include <cstring>
#include <climits>
using namespace std;
int n,len[51],slen,alpha[26],f[101]; char s[102],word[51][52];
int main(){
freopen("sents.in","r",stdin);
freopen("sents.out","w",stdout);
scanf("%d\n",&n);
for (int i=1;i<=n;i++) scanf("%s",word[i]+1),len[i]=strlen(word[i]+1);
scanf("%s",s+1); slen=strlen(s+1);
for (int i=1;i<=slen;i++){
f[i]=INT_MAX;
for (int j=1;j<=n;j++){
if (i<len[j]) continue; //不可能转换
int w=0;
memset(alpha,0,sizeof(alpha));
for (int k=1;k<=len[j];k++){
if (s[i-len[j]+k]!=word[j][k]) w++;//需要转换
alpha[s[i-len[j]+k]-97]++;//增加
alpha[word[j][k]-97]--;//减少
}
for (int k=0;k<26;k++) if (alpha[k]) w=INT_MAX;//如果出现不能解码的自动无解
if ((long long)f[i-len[j]]+w<f[i]) f[i]=f[i-len[j]]+w;//动态规划
}
}
if (f[slen]!=INT_MAX) printf("%d",f[slen]); else puts("-1");
}
本文介绍了一种使用动态规划解决字符串匹配问题的方法。通过定义状态转移方程 f[i] 来表示加密后单词 1 到 i 的最小代价,并通过不断更新此状态来寻找最优解。文章详细展示了如何通过比较子串并计算转换成本来实现这一过程。
474

被折叠的 条评论
为什么被折叠?



