题目大意:
解题思路:
dp+枚举
转移方程:f[i]=min(f[i],f[i−len[j]]+w);
转
移
方
程
:
f
[
i
]
=
m
i
n
(
f
[
i
]
,
f
[
i
−
l
e
n
[
j
]
]
+
w
)
;
w就是价值
在加密句子中寻找一段能够以当前单词转化,然后求出价值
最后dp找min
源程序:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#define MaxInt 2147483647/3
using namespace std;
int w,n,l,len[51],f[101],p[26];
string s[51],ss;
int main()
{
//freopen("sents.in","r",stdin);
//freopen("sents.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
cin>>s[i];
len[i]=s[i].size();
}
cin>>ss;
l=ss.size();
for (int i=1;i<=l;i++)
{
f[i]=MaxInt;
for (int j=1;j<=n;j++)
{
if (i<len[j]) continue;
for (int k=0;k<=25;k++) p[k]=0;
w=0;
for (int k=0;k<len[j];k++)
{
if (ss[i-len[j]+k]!=s[j][k]) w++;
p[int(ss[i-len[j]+k])-97]++;
p[int(s[j][k])-97]--;
}
for (int k=0;k<=25;k++)
if (p[k])
{
w=MaxInt;
break;
}
f[i]=min(f[i],f[i-len[j]]+w);
}
}
if (f[l]!=MaxInt) printf("%d\n",f[l]);
else puts("-1");
}