woj 1049 dp

来源:互联网 发布:常用的排序算法 编辑:程序博客网 时间:2024/06/05 00:41

题目链接:http://acm.whu.edu.cn/learn/problem/detail?problem_id=1049

//dp[i]表示以i结尾最少可以由多少个单词构成,如果单词j是i的后缀,//那么dp[i]=min(dp[i],dp[i-length(word[j])]+1);#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>using namespace std;bool is_houzui(char *s,char *a,int i){    int ii,jj;    for(ii=i,jj=strlen(a)-1;jj>=0;ii--,jj--)    {        if(s[ii]!=a[jj]) break;    }    if(jj<0) return true;    else return false;}int main(){    freopen("in.txt", "r", stdin);    //freopen("out.txt", "w", stdout);    int ncase,n,i,j;    char s[257],a[101][257];    cin>>ncase;    while(ncase--)    {        getchar();        cin>>s;        cin>>n;        getchar();        for(i=0;i<n;i++) cin>>a[i];        int dp[256];        dp[0]=0;        for(i=0;i<strlen(s);i++)        {            dp[i+1]=dp[i]+1;            for(j=0;j<n;j++)//这里是整个程序最耗时的地方,没有想怎么优化               if(strlen(a[j])<=i+1)                  if(is_houzui(s,a[j],i))                     dp[i+1]=min(dp[i+1],dp[i-strlen(a[j])+1]+1);            //cout<<dp[i+1]<<endl;        }        cout<<dp[strlen(s)]<<endl;    }    return 0;}


原创粉丝点击