URAL 1002 Phone numbers

感谢www.100xinxi.com为我提供数据。

[报告]

这道题目比较猥琐——反正提交了N+次,后来一找数据,一测,发现全错了,只好重写。

思路比较简单。

中心思想:DP

算法过程:

先是复制字母表DIC -》 AN,

然后把字典的字母全换成数字 CHECK 函数(我加了个没用的优化,就是把不可能的词语给删了。反正没用,自己在INIT里看看吧,我不讲了)

接着在母串中寻找词语FOUND函数,实际上是源自于KMP算法,找到所有可能可以放这个词语的地方假定它为J,那么M[J,LENGTH(DIC)]:=AN;F[J,LENGTH(DIC)]:=1;

然后是DP 过程。

这个方程就是:F[I,J+K]=F[I,J]+F[I+J,K];M[I,J+K]=M[I,J]+‘ ’+M[I+J,K];

条件就是:    (i+j+k<=len+1)and
              (m[i+j,k]<>'')and(m[i,j]<>'')and
              ((f[i,j+k]>f[i,j]+f[i+j,k])or
               (f[i,j+k]=f[i,j]+f[i+j,k])and(m[i,j]+' '+m[i+j,k]>m[i,j+k]))

最后答案就是F[1,LEN](不过我为了保险,就是用找全部的方法,其实没有什么用处的。)

终于结束了这道非常委琐的题目。以后URAL的路还长着呢……

 

程序:

// TASK: Phone numbers
const
  alp:array ['a'..'z'] of char=('2','2','2','3','3',
                                '3','4','4','1','1',
                                '5','5','6','6','0',
                                '7','0','7','7','8',
                                '8','8','9','9','9','0');
var
  nu,d:string;
  n,len,anf,dl:longint;
  flag:boolean;
  dic,an:array [0..50000] of string;
  pre:array [0..100] of longint;
  hash:array ['0'..'9'] of boolean;
  i,j,k:longint;
  m:array [0..100,0..100] of string;
  ans:string;
  f:array [0..100,0..100] of longint;
  function found(b:longint;var p,t:string):longint;
  var
    i,j,k:longint;
  begin
 //   exit(pos(p,copy(t,b,sizeof(t))));
    fillchar(pre,sizeof(pre),0);
    pre[1]:=0;
    k:=0;
    for i:=2 to length(p) do
    begin
      while (k>0)and(p[k+1]<>p[i]) do k:=pre[k];
      if p[k+1]=p[i] then inc(k);
      pre[i]:=k;
    end;
{    write('pre:');
    for i:=1 to length(p) do
      write(pre[i]:3);
    writeln;   }
    k:=0;
    for i:=b to length(t) do
    begin
      while (k>0)and(p[k+1]<>t[i]) do k:=pre[k];
      if p[k+1]=t[i] then inc(k);
      if k=length(p) then exit(i-length(p)+1);
    end;
    exit(-1);
  end;
 procedure init;
 var
   i,j,k:longint;
   flag:boolean;
  function check(var s:string):boolean;
  var
    i,j,k:longint;
  begin
    if length(s)>len then exit(false);
    for i:=1 to length(s) do
    begin
  

转载于:https://www.cnblogs.com/klarkxy/archive/2009/09/07/10017202.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值