题目链接。
分析:
dp[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。
dp[i] = min(dp[i+res]+res-strlen(pa[j]));
其中res 为从第 i 位开始匹配 pa[j] 所需要的长度。
以下代码当做指针的练习,研究了几天C,发现C语言功底到底是提升了(虽说算法功底至今还木有)。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxn = 500; char s[maxn], pa[610][30]; int dp[maxn]; int match(char *s1, char *s2) { char *p1 = s1, *p2 = s2; while(*p1 && *p2) { if((*p1++ == *p2)) p2++; } if(*p2) return 0; else return p1-s1; } int main() { int W, L, i, res; char (*p)[30]; scanf("%d%d", &W, &L); scanf("%s", s); for(i=0, p=pa; i<W; i++) { scanf("%s", *p++); } dp[L] = 0; for(int i=L-1; i>=0; i--) { dp[i] = dp[i+1]+1; for(int j=0; j<W; j++) if((res = match(&s[i], pa[j]))) dp[i] = min(dp[i], dp[i+res]+res-(int)strlen(pa[j])); } printf("%d ", dp[0]); return 0; }