zoukankan      html  css  js  c++  java
  • POJ3267 The Cow Lexicon(dp)

    题目链接

    分析:

    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;
    }
  • 相关阅读:
    排序
    wine-qq 安装
    逆元模板
    最长上升子序列
    SGU[115] Calendar
    SGU[123] The sum
    SGU[105] Div 3
    SGU[102] Coprimes
    SGU[100] A+B
    poj-1325-Machine Schedule
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3252316.html
Copyright © 2011-2022 走看看