返回   cpper编程论坛 > 算法
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2008-06-20
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 Elm在JavaEye发的动态规划题

本来想就地回了,无奈JavaEye的注册太繁琐了,贴在这里看看。

引用:
话说有个魔法字典,其中记录了一些魔力单词(字符串),如果一个句子(也是字符串)可以被完全分解为若干魔力单词的拼接,那么这个句子就是一条咒语。假设我们可以用常数时间查询魔力字典是否包含一个特定的单词,那么现在给你一个句子,让你写一个程序判断这个句子是否一条咒语。用动态规划可以解哦。
从i=1-n(n为句子字符串的长度),逐步推算前i个字符串组成的句子是否为咒语。对于前i个字符串,要么它本身是一个咒语,要么是一个咒语末尾加上一个字典里包含的单词。程序如下:

C++ 代码:
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <iterator>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. bool IsIncantation(string const& sentence, set<string> magicDic)
  10. {
  11.     size_t n = sentence.size();
  12.     if (n == 0)
  13.         return false;
  14.  
  15.     vector<bool> incanBits(n);
  16.     incanBits&#91;0] =
  17.         ( magicDic.find(sentence.substr(0, 1)) != magicDic.end() );
  18.  
  19.     for (size_t i = 1; i < n; ++i)
  20.     {
  21.         if ( (magicDic.find(sentence.substr(0, i + 1)) != magicDic.end()) )
  22.         {
  23.             incanBits&#91;i] = true;
  24.             continue;
  25.         }
  26.  
  27.         incanBits&#91;i] = false;
  28.         for (size_t j = 0; j < i; ++j)
  29.         {
  30.             if (incanBits&#91;j] == true &&
  31.                 magicDic.find(sentence.substr(j + 1, i - j)) != magicDic.end())
  32.             {
  33.                 incanBits&#91;i] = true;
  34.                 break;
  35.             }
  36.         }
  37.     }
  38.  
  39.     //copy(incanBits.begin(), incanBits.end(), ostream_iterator<bool>(cout, " "));
  40.     return incanBits&#91;n - 1];
  41. }
  42.  
  43. int main()
  44. {
  45.     string incants&#91;] = { "Zeta", "Mo", "Ma", "Doc", "EEEEEE", "Ear" };
  46.     set<string> dic;
  47.     for (size_t i = 0; i < sizeof(incants)/sizeof(incants&#91;0]); ++i)
  48.         dic.insert(incants&#91;i]);
  49.  
  50.     string sentence("MoMaMaMaDocEarEEEEEEZetaMoMo");
  51.     bool isIncant = IsIncantation(sentence, dic);
  52.  
  53.     cout << "The sentence \"" << sentence << "\" " << (isIncant ? "is " : "is not ")
  54.         << "an incantation" << endl;
  55.  
  56.     system("pause");
  57. }
__________________
Critics are like eunuchs in a harem; they know how it's done, they've seen it done every day, but they're unable to do it themselves.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2008-06-20
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 回复: Elm在JavaEye发的动态规划题

靠,这highlight把'['标识错了,Pora快改改
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 08:16 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0