Fancy Mouse
- -|||
典型的DP,开一个数组,第i个元素记录原字符串中以第i个字符结束的最小划分数。d[i] = min{d[j] + 1},0<=j<i,并且j~i之间的字符串可以在字典中查到。
#include<iostream>
#include
<cstring>
using namespace std;

const int MaxString = 256;
class Dictionary
{
public:
    Dictionary(
int word);
    
int Find(char* word,int length);
private:
    
int words;
    
char dictionary[100][MaxString];
}
;
int main()
{
    
int data,words,i,j,mem;
    
char string[MaxString];
    
int status[MaxString];
    Dictionary 
*d;
    cin
>>data;
    
while(data-- > 0)
    
{
        cin
>>string>>words;
        d 
= new Dictionary(words);
        status[
0= 0;
        
for(i=1;string[i-1!= '\0';i++)
        
{
            mem 
= 65535;
            
for(j=0;j<i;j++)
            
{
                
if(mem > status[j] + 1 && d->Find(string+j,i-j))
                    mem 
= status[j] + 1;
            }

            status[i] 
= (65535 == mem ? status[i-1] : mem);
        }

        delete(d);
        cout
<<status[i-1]<<endl;
    }

    
return 0;
}

Dictionary::Dictionary(
int word)
{
    words
=word;
    
for(int i=0;i<words;i++)
        cin
>>dictionary[i];
}

int Dictionary::Find(char* word,int length)
{
    
int flag;
    
char *t,*s;
    
for(int i=0;i<words;i++)
    
{
        
if(strlen(dictionary[i]) != length) continue;
        flag 
= 1;
        t 
= word;s = dictionary[i];
        
while(*s)
        
{
            
if(*t++ != *s++)
            
{
                flag 
= 0;
                
break;
            }

        }

        
if(flag) return 1;
    }

    
return 0;
}
posted on 2005-10-22 01:29  Fancy Mouse  阅读(383)  评论(1编辑  收藏  举报