您的位置:首页 > 其它

POJ 3267 The Cow Lexicon

2011-05-18 15:25 471 查看
定义状态:d[i]表示从i位置开始删除最少的字符使字符串可用所给的单词表示。状态转移方程:d[i] = min{d[i], d[i +1] + 1, d[s] + s - i - le},其中d[i]为len - i, d[i + 1] + 1表示当前字符删除后的最优值,d[s] + s - i - j表示从当前位置匹配单词X后的最优值, s为匹配单词X后i的位置,le为X的长度,s - i - j表示匹配单词X需要删除字符的个数。

程序代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char sour[310], dic[610][30];
int d[310];
int len, w, l;
int dp(int i)
{
int &ans = d[i];
if(ans != -1) return ans;
ans = len - i;
ans = min(ans, dp(i + 1) + 1);
for(int k = 0, j, s; k < w; k++){
if(dic[k][0] == sour[i]){
int le = strlen(dic[k]);
for(j = 1, s = i + 1; j < le;){
if(sour[s] == dic[k][j]) j++;
s++;
}
if(j >= le) ans = min(ans, dp(s) + s - i - j);
}
}
return ans;
}
int main()
{
freopen("input.txt", "r", stdin);
scanf("%d %d", &w, &l);
scanf("%s", sour);
for(int i = 0; i < w; i++) scanf("%s", dic[i]);
memset(d, -1, sizeof(d));
len = strlen(sour);
printf("%d/n", dp(0));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: