POJ 3267.The Cow Lexicon
2017-11-24 17:29
381 查看
题目:http://poj.org/problem?id=3267
AC代码(C++):
总结: 动态规划(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]就是答案.
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]就是答案.
相关文章推荐
- POJ-3267 The Cow Lexicon 简单DP
- The Cow Lexicon(POJ--3267
- POJ 题目3267 The Cow Lexicon(动态规划)
- POJ 3267-The Cow Lexicon (动态规划)
- POJ 3267 The Cow Lexicon(DP)
- POJ 3267-The Cow Lexicon 动态规划
- poj 3267 The Cow Lexicon dp
- poj 3267 The Cow Lexicon(动规)
- POJ 3267-The Cow Lexicon(dp_字符串)
- poj 3267 -- The Cow Lexicon
- POJ 3267 The Cow Lexicon
- poj 3267 The Cow Lexicon DP 动态规划
- poj-3267 The Cow Lexicon【dp】
- poj 3267 The Cow Lexicon
- poj 3267 The Cow Lexicon(动规)
- 【poj 3267】The Cow Lexicon 题意&题解&代码(C++)
- POJ 3267 The Cow Lexicon(DP单词匹配)
- POJ 3267 The Cow Lexicon DP
- POJ 3267 The Cow Lexicon 动态规划
- poj 3267 The Cow Lexicon (动态规划)