http://poj.org/problem?id=3267
题意 : 给你一个message,是给定字符串,然后再给你字典,让你将message与字典中的单词进行匹配,输出要删掉多少字母。
思路 : 动态规划问题,不仅要找对公式,还要注意一些细节问题
样例解释 : 6是字典里有6个单词,10是给定的字符串的长度,给定的字符串可以与下面的brown和cow匹配,但要删掉两个字母
6 10 browndcodw cow milk white black brown farmer
#include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std ; int main() { int W,L,len ; string mess,dic[40000]; cin>>W>>L ; int dp[10000] ; cin>>mess ; for(int i = 0 ; i < W ; i++) cin>>dic[i] ; dp[L] = 0 ;//dp[i]代表着从i到L所要删除的字符个数 for(int i = L-1 ; i >= 0 ; i--)//从message中倒着找 { dp[i] = dp[i+1]+1 ;//先将最坏的可能存入数组 for(int j = 0 ; j < W ; j++) { len = dic[j].length() ; if(len <= L-i && dic[j][0] == mess[i])//字典里的某个单词的长度要小于你进行匹配的一部分message的长度 { int me = i,di = 0 ; while(me < L) { if(dic[j][di] == mess[me++]) { di++ ; } if(di == len) { dp[i] = min(dp[i],dp[me]+me-i-len) ;//dp[me]代表着从me到L要删除的字符的个数,me-i代表匹配过程中,从位置i到me的区间长度,再减去单词长度,即可得则得到从i到me所删除的字符数 break ; } } } } } cout<<dp[0]<<endl ; return 0 ; }