10.6 句子 2409

原创 2017年10月06日 21:53:01

题目

明明与可可经常在网上聊天,但最近他们发现父母们可能偷看了他们的隐私谈话,因此他们发明了一些加密语言的方法。
所有合法的单词在给定的单词列表中。一个句子有一些合法单词连续组成(没有空格)。每个单词可以出现任意多次。特殊的加密方法是:每个单词在传送之后,它的字母有可能打乱了重新排列。这次加密的代价定义为:加密前的单词和加密后的单词有多少位置上的字母不相同。如:“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.
版权声明:欢迎借鉴,拒绝抄袭

相关文章推荐

polya定理 poj1286 poj2409

思路: 置换:【1,2,…,n | a1, a2,…an】 表示1被a1取代(a1为1到n的某数),2被a2取代……, a1,a2…,an不相同 置换群:置换群的元素是置换,运算时置换的连接。...

RFC2409密钥交换协议IKE

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

POJ 2409 - Let it Bead【Polya定理】

Let it Bead Time Limit: 1000MS Memory Limit: 65536KB Description: "Let it Bead" company is located...

POJ 2409 Let it Bead polya 定理 和 置换

这道题应该是比较裸的一道题目了。 最开始做的时候完全想不到用什么gcd之类的东西。。。 然后直接模拟旋转和翻转的过程求置换群去了。 虽然结果是对的,不过是n2的算法,还好题目的数据很小。 先进...

HDU 2409 Team Arrangement(模拟)

很简单,就是从22个球员中选出一支球队来: 1.按序号选出所有的球员, 2.选出最长时间的当队长。 #include #include #include #include #incl...

(带讲解)poj2409&poj1286 polya模板

题意:用m种颜色染长度为n的环,旋转和对称认为是同一种方案,求本质不同的方案数。我们只要考虑出置换群G,直接套polya公式即可。首先,考虑一下旋转。对于旋转,所有的节点都会旋转,所以循环节长度应该是...

POJ1286,2409——Let it Bead,Necklace of Beads( Pólya定理)

Necklace of Beads Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5737Accepted: 2367 ...

【结构体排序】hdu 2409 Team Arrangement

【结构体排序】hdu 2409 Team Arrangement题目链接:hdu 2409 Team Arrangement题目大意给出22个球员的各种信息,要求按照给出的阵形选择球员和队长共11人;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)