您的位置:首页 > 其它

POJ 3267.The Cow Lexicon

2017-11-24 17:29 381 查看
题目:http://poj.org/problem?id=3267

AC代码(C++):

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>

#define INF 0xfffffff
#define MAXN 100105

using namespace std;

int W,L;
char msg[305];
int dp[305];
string dict[605];

int main(){
cin>>W>>L;
cin>>msg;
for(int i = 0; i < W; i++)cin>>dict[i];
dp[L] = 0;
int pm,pd,len;
for(int i = L-1; i >= 0; i--){
dp[i] = dp[i+1]+1;
for(int j = 0; j < W; j++){
len = dict[j].length();
if(L-i>=len&&dict[j][0]==msg[i]){
pm = i;
pd = 0;
while(pm<L){
if(msg[pm]==dict[j][pd])pd++;
pm++;
if(pd==len){
dp[i] = min(dp[i],dp[pm]+(pm-i)-len);
break;
}
}
}
}
}
cout<<dp[0];
}

总结: 动态规划(E[j]=opt{D+w(i,j)}). dp[i]表示从message的第i位到末端最少去掉多少字符才能与字典匹配. 初始化dp[L]=0, 则答案就是dp[0]. i从L-1到0更新dp数组, 首先令dp[i]=dp[i+1]+1表示为最差的情况, 然后遍历字典, 看从i开始往后能否匹配到单词, 若能则更新dp数组, 使dp[i] = min(dp[i],dp[pm]+(pm-i)-len), 即取最小, dp[pm]+(pm-i)-len的意思是msg中匹配的末端位置的最小需要去掉的字符数加上跟这个词匹配所需要去掉的字符数.
更新完dp数组后dp[0]就是答案.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: