携程笔试5.27-1图,2dp

5.27

给出有向图:

找出最多跳过k步,从start节点到end节点的所有路径总数

/*
现有n个火车站(2≤n≤50)用编号1~n表示,彼此之间的通车情况用字符串
"a,b" 表示,如:"2,3" 表示有一条2号车站到3号车站的单程线路。
现随意给出两个车站序号 xy 和 最大途经中转站个数 k0≤k≤n-2),
要求计算出 x y 最多中转 k 次的所有线路数量(同一站点不可重复经过)。
*/
/*
3
1,2 2,3 1,3
1 3
1
输出2
*/

个人思路:使用邻接表保存有向图HashMap(Integer,HashSet):一个节点可达的其他节点。递归深度优先:完成40.

抽奖:

给定两个序列:A,B

A是抽奖序列

B是中奖序列

从A的所有连续子串中找到覆盖B的所有元素的最短串,取其中所有最短串中index最靠前的为结果

例如:假设抽奖序列s为[1,2,5,4,3,4,7,1,4,9,3,1],中奖序列为[3,1,4],其中:

1、抽奖序列s([1,2,5,4,3,4,7,1,4,9,3,1])中1,2,5,4,3为一个子序列s',长度为5

2、抽奖序列s([1,2,5,4,3,4,7,1,4,9,3,1])中3,4,7,1为一个子序列s',长度为4

3、抽奖序列s([1,2,5,4,3,4,7,1,4,9,3,1])中4,9,3,1为一个子序列s',长度为4

起始位置编号最小的最小子序列为3,4,7,1,其起始位置编号为5,所以获奖者的编号为5

个人思路:暴力:所有的中奖序列都存在一个数组里:由于数字只有1-9所以数组的长度为10,数组的值表示中奖号码的个数.

遍历抽奖序列:如果一个数存在中奖序列(在数组中的值>0)那么继续遍历。直到中奖序列全部出现,返回子串的长度,并且返回当前子串的第一个序列的index,

当找到第二个符合的条件的时候比较串的长度,如果串的长度小于(写的是小于等于,其实没必要,因为index是增长的,长度一样还是不用更新)当期记录的最小长度,则更新index。等于排除了,因为index一直往后加。。。

通过了30,可能存在了大量的重复计算。需要用dp解决。

原文地址:https://www.cnblogs.com/wsZzz1997/p/14825448.html