題目:已知一些字典序排列的單詞,問能從中找到最大的一個有序單詞集合,

使得集合中的單詞每一個是有上一個單詞經過一次變換得來的(增、刪、改)。

分析:dp,LIS。最大遞增子序列,不過數據較大须要優化。

因為,不是每一個單詞都是还有一個單詞的前驅,所以非常多查找是不必要的。

所以,利用每個單詞進行變換求出全部前驅,然後查找前驅是否在前面出現過;

假设出現過。則能够更新LIS。查找前驅的過程使用二分優化就可以節約時間。

說明:本來先用hash表+記憶化搜索,效率較低╮(╯▽╰)╭。

#include <cstring>
#include <cstdio> #define max(a, b) ((a)>(b)?(a):(b)) char list[25005][17], now[17], New[17];
int dp[25005]; int binary_search(int r, char words[])
{
int l = 0, mid = 0, cmp;
while (l <= r) {
mid = (l+r)>>1;
cmp = strcmp(list[mid], words);
if (!cmp) return mid;
if (cmp > 0) r = mid-1;
else l = mid+1;
}
return -1;
} int main()
{
int size = 0;
while (~scanf("%s",list[size])) ++ size; int maxv = 0;
for (int p = 0; p < size; ++ p) {
dp[p] = 1;
strcpy(now, list[p]);
int length = strlen(now), point = -1;
//删除元素
for (int i = 0; i < length; ++ i) {
if (now[i] < now[i+1]) continue;
int count = 0;
for (int j = 0; j < length; ++ j)
if (i != j) New[count ++] = now[j];
New[count ++] = 0;
point = binary_search(p-1, New);
if (point >= 0 && dp[p] <= dp[point])
dp[p] = dp[point]+1; }
//加入元素
for (int i = 0; i <= length; ++ i)
for (char k = 'a'; k <= 'z'; ++ k) {
if (k > now[i]) continue;
int count = 0;
for (int j = 0; j <= length; ++ j) {
if (i == j) New[count ++] = k;
New[count ++] = now[j];
}
New[count ++] = 0;
point = binary_search(p-1, New);
if (point >= 0 && dp[p] <= dp[point])
dp[p] = dp[point]+1;
}
//改变元素
for (int i = 0; i < length; ++ i)
for (char k = 'a'; k < now[i]; ++ k) {
strcpy(New, now);
New[i] = k;
point = binary_search(p-1, New);
if (point >= 0 && dp[p] <= dp[point])
dp[p] = dp[point]+1;
}
maxv = max(maxv, dp[p]);
} printf("%d\n",maxv);
return 0;
}

UVa 10029 - Edit Step Ladders的更多相关文章

  1. UVA - 10029 Edit Step Ladders (二分+hash)

    Description Problem C: Edit Step Ladders An edit step is a transformation from one word x to another ...

  2. UVA 10029 Edit Step Ladders ——(DAG求最长路)

    题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路 ...

  3. Edit Step Ladders - UVA 10029

    题意 题目链接(Virtual Judge):Edit Step Ladders - UVA 10029 题意: 如果单词 \(x\) 能通过添加.删除或修改一个字母变换为单词 \(y\),则称单词 ...

  4. uva 10026 Problem C: Edit Step Ladders

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. POJ2564:Edit Step Ladders

    浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html 题目传送门:http://poj.org/problem?id=2564 记\(f[i ...

  6. UVa 10029 hash + dp

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  8. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  9. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

随机推荐

  1. IIS6 Gzip 网页GZIP压缩(转)

    现在主流浏览器基本都支持 Gzip 压缩,因此这也成了 WebServer 优化策略的一种常规手段.启用压缩后能有效减少网页传输数据大小,使得有限带宽能提供更多的请求,并在一定程度上提高了网页 &qu ...

  2. LeetCode 754. Reach a Number到达终点数字

    题目 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数. 示例 1: 输 ...

  3. Populating Next Right Pointers in Each Node leetcode java

    题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...

  4. 老猪带你玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  5. 解剖android中的闹钟app 一

    首先,看一看android市场上有哪些主流的闹钟app了,我们来进行一个简单的评测: 一.正点闹钟 这是一款源自金山技术的闹钟app,其主力创始团队都是来自于金山,其装机量,下载量都是排名第一.老样子 ...

  6. 1 R语言介绍

    注释:# 赋值:<- 查看.设定当前工作目录:getwd()  setwd()   wd:workspace directory[setwd("c:/myproject/project ...

  7. Centos安装gcc及g++

    Centos支持yum安装,安装软件一般格式为yum install .......,注意安装时要先成为root用户. 按照这个思路,我想安装过程如下: 安装gcc:yum install gcc 安 ...

  8. VIM的buffers

    原文:http://ju.outofmemory.cn/entry/13522 重新在不同的 tab 中打开多个关闭的buffer 文件, https://stackoverflow.com/ques ...

  9. Struts2的Action继承ActionSupport时,利用AOP来拦截Action出现NoSuchMethodException

    参考:http://zhanghua.1199.blog.163.com/blog/static/46449807201111139501298/ 做项目的时候,由于要用到在Struts2的Actio ...

  10. php 传变量到 js 文件

    php 传变量到 js 文件 // 传变量到js $oncj="taocanonc(".$i.",".$alli.",".$row1[mon ...