Eoj 1018. 单词的划分 (dfs)

题面

有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。

出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。

输入格式
第一行为一整数 T,表示有 T 组测试数据。

每组测试数据第一行为一字符串。(长度小于 256)

第二行为一整数 N。(1<=N<=100)

以下 N 行,每行一个单词,每个单词长度小于 128。

输出格式
每组测试数据占一行 , 这一行只有一个整数,表示字符串可以被划分成的最少的单词数。我们保证单词是可划分的。

样例
input
1
realityour
5
real
reality
it
your
our
output
2

思路

dfs,从每个点开始爆搜,判断是不是单词集合中的元素,到字符串结尾返回结果。

代码实现

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=110;
const int inf=0x3f3f3f3f;
string s;
vector <string> cor;
int t,n,ans=inf;

bool find (string now) {
   for (int i=0;i<cor.size();i++) {
       if (now==cor[i]) return true;
   }    
   return false;
}

void dfs (int p,int sum) {
     if (p==s.size ()) {
         if (sum<ans) ans=sum;
     }
     else {
         for (int i=p;i<s.size ();i++) {
             string str=s.substr (p,i-p+1);
             if (find (str)) {
                 int q=i+1;
                 dfs (q,sum+1);
             }
         }
     }
}

int main () {

     cin>>t;
     while (t--) {
       cin>>s; 
       ans=inf;
       cor.clear ();
       cin>>n;
       for (int i=1;i<=n;i++) {
           string a;
           cin>>a;
           cor.push_back (a);
       }
       dfs (0,0);
       cout<<ans<<endl;
     }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/hhlya/p/13374892.html