关闭

10.6 句子 2409

134人阅读 评论(0) 收藏 举报
分类:

题目

明明与可可经常在网上聊天,但最近他们发现父母们可能偷看了他们的隐私谈话,因此他们发明了一些加密语言的方法。
所有合法的单词在给定的单词列表中。一个句子有一些合法单词连续组成(没有空格)。每个单词可以出现任意多次。特殊的加密方法是:每个单词在传送之后,它的字母有可能打乱了重新排列。这次加密的代价定义为:加密前的单词和加密后的单词有多少位置上的字母不相同。如:“abc”变为“abc”,则代价为0;如果变为“acb”、“cba”或“bac”则代价为2;如果变为“bca”或“cab”则代价为3。
对于接收到的句子,解码成加密前的句子可能有多种方案,但明明和可可知道只有句子的加密总代价最小的方案才是真正的原句。面对这么复杂的加密语言,他们的父母当然看不懂。但不幸的是,他们自己也搞不懂了,他们需要你帮助研究。
对于给定的合法单词列表和加密后的句子,求出有合法单词通过加密形成现在句子的最小代价。如果没有可能,则输出-1。
提示:如果一个单词出现多次,每次加密后的单词不一定相同

输入样例
4
one
two
three
there
neotowheret
输出样例
8
样例解释
“one”->“neo” 代价为3;
“two”->“tow” 代价为2;
“three”->“heret”代价为3;
“there”->“heret”代价为5;
最小代价=3+2+3=8.
数据范围
合法单词数:1<=n<=50;每个单词长度:1<=len<=50;句子长度:1<=lens<=100
所有单词和句子中的字符都是小写字母“a”~“z”

题解

动态规划,很容易理解的
设f[i]表示从1到i的句子组成合法句子的最小代价
f[i]=min(f[i],f[i-s]+w)
s为当前单词的长度
w为将加密后的当前单词转换为合法单词的最小代价(可以统计单词中每个字母出现的次数,进行比较)

O(26n2lenth)

代码

var
  n,i,j,k,ans,min:longint;
  s:string;
  a:array[1..50,1..26]of longint;
  t:array[1..50]of string;

function night(b:string;var c:longint):boolean;
var
  i,j,e,f,g:longint;
  d:array[1..26]of longint;
begin
  night:=true;
  fillchar(d,sizeof(d),0);
  for i:=1 to length(b) do
    inc(d[ord(b[i])-96]);
  g:=0;
  for i:=1 to n do
    begin
      e:=1;
      if length(t[i])<>length(b) then e:=0 else
      for j:=1 to 26 do
        if a[i,j]<>d[j] then begin e:=0;break;end;
      if (e=1) then
        begin
          f:=0;
          g:=1;
          for j:=1 to length(t[i]) do
            if t[i][j]<>b[j] then inc(f);
          if f<c then c:=f;
        end;
    end;
  if g=0 then exit(false);
end;

procedure dfs(k,m:longint);
var
  i,j,c:longint;
begin
  if (k>length(s))and(m<ans) then begin ans:=m;exit;end;
    for j:=min+k-1 to length(s) do
      if night(copy(s,k,j-k+1),c) then
        begin
          dfs(j+1,m+c);
          if (j+1>=length(s))and(m+c=5) then
            begin
              c:=0;
            end;
          night(copy(s,k,j-k+1),c);
        end;
end;

begin
  readln(n);
  min:=50;
  for i:=1 to n do
    begin
      readln(s);
      t[i]:=s;
      if length(s)<min then min:=length(s);
      for j:=1 to length(s) do
        inc(a[i,ord(s[j])-96]);
    end;
  readln(s);
  ans:=1000;
  dfs(1,0);
  if ans<>1000 then writeln(ans) else writeln(-1);
end.
1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

CRS报CRS-2409告警信息问题分析与处理

CRS报CRS-2409告警信息问题分析与处理 (CRS-2409:The clock on host XXXdb1 is not synchronous with the mean cluster ...
  • ljunjie82
  • ljunjie82
  • 2013-08-08 22:00
  • 4020

苹果Mac OS X 10.6 Snow Leopard雪豹操作系统BT种子(.torrent)下载,6.13G个人版和Sever服务器版

之前说过《苹果Mac OS X 10.6 Snow Leopard雪豹操作系统8月28日上市》,今天从网上找到了苹果电脑Mac OS X 10.6 Snow Leopard雪豹操作系统BT种子(....
  • e_wsq
  • e_wsq
  • 2013-03-23 03:38
  • 1359

MyEclipse10.6导出war包出错, 解决方法, 外部打war包

MyEclipse10.7破解版已经不存在此问题了 这里只解决如何打war包,没有讲解如果完全破解MyEclipse10.6,因为我们的目的是要导出war包 外部打war包的方法有两种: 1.直接...
  • bruceoyqq
  • bruceoyqq
  • 2013-12-20 10:25
  • 5298

爱立信2409(pico)设备调试

  • 2013-09-26 13:51
  • 398KB
  • 下载

netcore nw705 735 web直接刷netis(WF2409D固件,实现wisp万能中继

  • 2017-04-22 11:09
  • 3.81MB
  • 下载

RFC2409密钥交换协议IKE

  • 2012-06-19 21:09
  • 638KB
  • 下载

【POJ - 2409 && POJ - 1286 】 【polya定理】【旋转 or 翻转 详解】

这两个题目就是一个题目。 题意: 有一个长度为n的项链,现在给m个颜色的珠子,每种的珠子个数都是无限个,现在问你能够做成几个本质不同的项链(如果两个项链不能够通过旋转或者翻转达到相同,则认为本质不...
  • qq_37383726
  • qq_37383726
  • 2017-11-11 11:50
  • 81

poj2409 等价类计数问题 polya定理

关于polya定理:n个珠子,t种颜色,手镯的种数: (1)旋转:逆时针旋转i颗珠子的间距,则珠子0,、i、2i、......构成一个循环。这个循环有n/gcd(i,n)个元素。根据对称性,所有循环...
  • u011526463
  • u011526463
  • 2013-08-02 18:13
  • 539

CRS报CRS-2409告警信息问题分析与处理

CRS报CRS-2409告警信息问题分析与处理       ORACLE 11.2.0.3   1、报错信息 检查第1节点的CRS alert log,发现存在有下面异常信息 2013-0X-XX ...
  • wll_1017
  • wll_1017
  • 2016-12-12 14:14
  • 213

(带讲解)poj2409&poj1286 polya模板

题意:用m种颜色染长度为n的环,旋转和对称认为是同一种方案,求本质不同的方案数。我们只要考虑出置换群G,直接套polya公式即可。首先,考虑一下旋转。对于旋转,所有的节点都会旋转,所以循环节长度应该是...
  • thchuan2001
  • thchuan2001
  • 2017-03-24 21:16
  • 322
    个人资料
    • 访问:26727次
    • 积分:2448
    • 等级:
    • 排名:第17394名
    • 原创:203篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    最新评论