首页 > 其他 > 详细

Eoj 1018. 单词的划分 (dfs)

时间:2020-07-24 23:28:57      阅读:118      评论:0      收藏:0      [点我收藏+]

题面

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

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

输入格式
第一行为一整数 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;
}

Eoj 1018. 单词的划分 (dfs)

原文:https://www.cnblogs.com/hhlya/p/13374892.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!