一道动态规划算法题

/*
腾讯的编程大赛复赛题
QQ拼音是深受用户欢迎的一款准确、快速、绿色的拼音输入法。你对输入法感兴趣吗? 现在交给精通程序设计的你一个小任务,也是拼音输入第一步要做的工作,那就是根据用户输入的拼音串将它们划分成合法的音节串。
比如用户输入”tengxunhuanyingni”的时候,这个拼音串(假设为S)可能的划分方式为:

  1. teng’xun’huan’ying’ni
  2. teng’xun’hu’an’ying’ni

我们现在要求你计算出S的最小表示串(MPS),最小表示串就是,任何一种划分方式都可以看作是最小表示串上去掉若干个分隔符”’”得到,并且分隔符个数最少的一种表示。比如上面的第二种划分方式实际上就是该拼音串的MPS。再如”亲爱的”的拼音”qinaide”的MPS是”qi’n’ai’de”。因为可以这样划分:

  1. qin’ai’de
  2. qi’nai’de

Input
输入第一行包含两个整数N,M,N表示需要处理的拼音串的个数,M代表所有的合法音节的个数。1 ≤ N,M ≤ 1000
输入第二行是M个长度不超过6的合法音节,用空格分隔。
随后的N行,每行是一个长度不超过100000 (即105)的字母串, 全部由小写字母组成.
Output
输出为N行,对应要处理的拼音串的最小化分。用”’”来切分各个音节,不要包含如空格等任何其他字符。
如果输入的拼音串不能得到合法的切分,则该行输出”invalid”。
Sample Input
4 412
a ai an ang ao e ei en eng er o ou ba bai ban bang bao bei ben beng bi bian biao bie bin bing bo bu ca cai can cang cao ce cen ceng ci cong cou cu cuan cui cun cuo cha chai chan chang chao che chen cheng chi chong chou chu chua chuai chuan chuang chui chun chuo da dai dan dang dao de dei den deng di dia dian diao die ding diu dong dou du duan dui dun duo fa fan fang fei fen feng fiao fo fou fu ha hai han hang hao he hei hen heng hong hou hu hua huai huan huang hui hun huo ka kai kan kang kao ke kei ken keng kong kou ku kua kuai kuan kuang kui kun kuo ga gai gan gang gao ge gei gen geng gong gou gu gua guai guan guang gui gun guo ji jia jian jiang jiao jie jin jing jiong jiu ju juan jue jun la lai lan lang lao le lei leng li lia lian liang liao lie lin ling liu lo long lou lu luan lue lun luo lv na nai nan nang nao ne nei nen neng ni nian niang niao nie nin ning niu nong nou nu nuan nue nun nuo nv ran rang rao re ren reng ri rong rou ru ruan rui run ruo ma mai man mang mao me mei men meng mi mian miao mie min ming miu mo mou mu pa pai pan pang pao pei pen peng pi pian piao pie pin ping po pou pu qi qia qian qiang qiao qie qin qing qiong qiu qu quan que qun sa sai san sang sao se sen seng si song sou su suan sui sun suo sha shai shan shang shao she shei shen sheng shi shou shu shua shuai shuan shuang shui shun shuo ta tai tan tang tao te tei teng ti tian tiao tie ting tong tou tu tuan tui tun tuo wa wai wan wang wei wen weng wo wu xi xia xian xiang xiao xie xin xing xiong xiu xu xuan xue xun ya yan yang yao ye yi yin ying yo yong you yu yuan yue yun za zai zan zang zao ze zei zen zeng zi zong zou zu zuan zui zun zuo zha zhai zhan zhang zhao zhe zhei zhen zheng zhi zhong zhou zhu zhua zhuai zhuan zhuang zhui zhun zhuo
tengxunhuanyingni
qinaide
qqpinyin
sangeren
Sample Output
teng’xun’hu’an’ying’ni
qi’n’ai’de
invalid
san’g’e’r’en*/
//分析:字符串匹配加动态规划
//先遍历找出每个位置的匹配字符串,然后对每个位置进行动态规划
下面是弱化版的程序,定义每行为长度不超过100的字符串

#include "stdafx.h"
#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 

using namespace std;

vector<string> syllable[26];    //合法音节vector
vector<string> pinyin;          //待处理串
vector<int> mps;                //mps
vector<int> num[100];           //匹配的字符串的位置
vector<int> position;           //'的位置
unsigned int M,N;               //N表示需要处理的拼音串的个数,M代表所有的合法音节的个数


int _tmain(int argc, _TCHAR* argv[])
{
    unsigned int i,j,k;
    unsigned int invalid=0;
    string temp;
    vector<string>::iterator it;
    vector<int>::iterator he;

    cin>>N>>M;

    for(i=0;icin>>temp;
        syllable[temp[0]-'a'].push_back(temp);
    }
    cout<for(i=0;i<26;i++){
        for(it=syllable[i].begin();it!=syllable[i].end();it++){
            cout<<*it<<' ';
        }
        cout<for(i=0;icin>>temp;
        pinyin.push_back(temp);
    }
    for(it=pinyin.begin();it!=pinyin.end();it++){
        cout<<*it<//对每个字符串进行处理
    for(i=0;i0);
        for(j=0;jfor(it=syllable[pinyin[i][j]-'a'].begin();it!=syllable[pinyin[i][j]-'a'].end();it++){
                if(pinyin[i].compare(j,(*it).length(),*it)==0){
                    num[j].push_back((*it).length()+j);
                }
            }
            mps.push_back(0);
            for(k=j+1;k>=1;k--){
                for(he=num[k-1].begin();he!=num[k-1].end();he++){
                    if(j+1==(*he)){
                        if(k-1==0){
                            mps[j+1]=mps[j+1]|(mps[k-1]|(1<else{
                            if(mps[k-1]!=0){
                                mps[j+1]=mps[j+1]|(mps[k-1]|(1<//mps[j+1]=mps[j+1]|(mps[k-1]|(1<
                    }
                }
            }
        }
        unsigned int fmps=mps[pinyin[i].length()];
        if(fmps==0){
            cout<<"invalid"<for(k=0;k<100;k++){
                num[k].clear();
            }
            continue;
        }
        k=0;
        while(fmps){
            if(fmps&0x01){
                position.push_back(k);
            }
            fmps=fmps>>1;
            k++;
        }
        k=0;
        temp=pinyin[i];
        for(he=position.begin();he!=position.end();he++){
            temp.insert((*he)+1+k,"'");
            k++;
        }
        cout<for(k=0;k<100;k++){
            num[k].clear();
        }

    }

    return 0;
}

你可能感兴趣的:(算法,编程,动态规划,输入法,算法)