2022-10-03:给定一个正数n,比如6
表示数轴上有 0,1,2,3,4,5,6
<0 或者 >6 的位置认为无法到达
给定两个数字x和y,0<= x,y <= n
表示小人一开始在x的位置,它的目的地是y的位置,比如x = 1, y = 3
给定一个字符串s,比如 : rrlrlr
任何一个s的子序列,对应着一种运动轨迹,r表示向右,l表示向左
比如一开始小人在1位置,"rlr"是s的一个子序列
那么运动轨迹是:1 -> 2 -> 1 -> 2
求,s中有多少个字面值不同的子序列,能让小人从x走到y,
走的过程中完全不走出0到n的区域。
比如,s = “rrlrlr”, n = 6, x = 1, y = 3
有如下5个字面值不同的子序列
rr : 1 -> 2 -> 3
rrlr : 1 -> 2 -> 3 -> 2 -> 3
rrrl : 1 -> 2 -> 3 -> 4 -> 3
rlrr : 1 -> 2 -> 1 -> 2 -> 3
rrlrlr : 1 -> 2 -> 3 -> 2 -> 3 -> 2 -> 3
注意:一定要是字面值不同的子序列!相同字面值的子序列算一种,
比如s中,有很多个rr的子序列,但是算一个,
数据规模 : s串长度 <= 1000, x,y,n <= 2500。
来自SnowFlake。

答案2022-10-03:

动态规划。
如果字符串长度为m,位置数量n。
时间复杂度:O(m * n)。
时间复杂度:O(n)。

代码用rust编写。代码如下:

use std::iter::repeat;
fn main() {
let ans = ways2("rrlrlr", 6, 1, 3);
println!("ans = {}", ans);
} fn ways2(s: &str, n: i32, x: i32, y: i32) -> i32 {
// all[i] : 让小人来到i位置的不同字面值的子序列数量
let mut all: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
// r[i] : 让小人来到i位置的不同字面值,且以r字符结尾,的子序列数量
let mut r: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
// l[i] : 让小人来到i位置的不同字面值,且以l字符结尾,的子序列数量
let mut l: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
let mut add: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
// 一开始小人在x,all[x] = 1, {}
all[x as usize] = 1;
// M
for cha in s.bytes() {
// 当前的指令字符串,cha
if cha == 'r' as u8 {
// 当前小人往右走
// 0 -> 1
// 1 -> 2
// 5 -> 6
// n-1 -> n
// n -> 死
// 4 1000
// 5 +1000
//
// 8 200
// 9 +200
for i in 0..n {
// 9 方法数 新增 all[8]
// 每一个新增方法,都还没有减去修正值呢!
add[(i + 1) as usize] += all[i as usize];
}
for i in 0..=n {
// 变了!成了纯新增!
add[i as usize] -= r[i as usize];
all[i as usize] += add[i as usize];
r[i as usize] += add[i as usize];
add[i as usize] = 0;
}
} else {
// 遇到的是l
// 当前小人往左走
// 0 左 死
// 1 0
// 2 1
// 3 2
for i in 1..=n {
// 7 新增 之前8位置方法数
add[(i - 1) as usize] += all[i as usize];
}
for i in 0..=n {
// 修正,变成纯新增!
add[i as usize] -= l[i as usize];
all[i as usize] += add[i as usize];
l[i as usize] += add[i as usize];
add[i as usize] = 0;
}
}
}
// 去重的!
return all[y as usize];
}

执行结果如下:


左神java代码

2022-10-03:给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它的更多相关文章

  1. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

  2. 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

    因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...

  3. NS2的LEACH仿真出来的nam文件拓扑的节点为什么x=0,且y=0

    查看.tr文件和.nam发文件下所有的节点的x,y值都是(0,0),nam图像更没有运行出来 于是我将if { $opt(sc) == "" } {puts "*** N ...

  4. tensorflow学习之(一)预测一条直线y = 0.1x + 0.3

    #预测一条y = 0.1x + 0.3的直线 import tensorflow as tf import numpy as np #科学计算模块 ''' tf.random_normal([784, ...

  5. hdu6055 Regular polygon 脑洞几何 给定n个坐标(x,y)。x,y都是整数,求有多少个正多边形。因为点都是整数点,所以只可能是正四边形。

    /** 题目:hdu6055 Regular polygon 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6055 题意:给定n个坐标(x,y).x,y都 ...

  6. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  7. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  8. 均值为1的独立指数随机Y1,Y2,组合成的Y=Y1-(Y2-1)^2/2 在Y>0的条件下也是指数随机变量

    均值为1的独立指数随机Y1,Y2,组合成的Y=Y1-(Y2-1)^2/2  在Y>0的条件下也是指数随机变量 另一个条件分布 13题有错误,应该是P{x<X<x+dx,y<Y& ...

  9. Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...

  10. 给定表达式[x/2] + y + x * y, 其中x,y都是正整数。

    改进了一下,不过还是要十多秒吧. package com.boco.study; import java.math.BigDecimal; import java.util.Calendar; imp ...

随机推荐

  1. Windows10电源选项:睡眠、休眠、启用快速启动

    参考链接: http://www.dnpz.net/diannaozhishi/2223.html http://www.cfan.com.cn/2018/0118/130151.shtml 在介绍w ...

  2. Git 小技巧:忽略某些文件的更改

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/dp9Mwq7vf0ASF_FftBN8Ww 作为一枚合格的代码贡献 ...

  3. 如何利用javaweb实现数据的可视化

    描述 之前一直使用html进行网页版的数据库查询啥的,没有图片的参与,也没有将一条条数据变成较为直观的图画形式,这就是来实现以下数据的图画形式 了解及基础说明 通过查阅资料,我首先了解到要是想实现数据 ...

  4. Android笔记--在活动之间传递消息

    显式Intent和隐式Intent Intent--各个组件信息沟通的桥梁 组成部分: 显式Intent:--精确匹配 具体实现: 1.在Intent的构造函数中指定 2.调用意图对象的setClas ...

  5. 声网 MetaKTV 技术揭秘之“声临其境”:3D 空间音效+空气衰减+人声模糊

    声网近期发布了"MetaChat 元语聊"."MetaKTV"解决方案,致力于提供一种全新的元宇宙互动社交.K 歌方式,其中都提到了"3D 空间音频& ...

  6. 声网发布教育新品:灵动课堂全球覆盖学生超400万,互动白板首创H5课件

    3月31日,全球实时互动云服务商声网Agora在北京举行教育产品发布会,正式发布教育行业首款aPaaS产品"灵动课堂",和首个支持H5课件的白板PaaS产品"互动白板&q ...

  7. ElasticSearch 实现分词全文检索 - 高亮查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  8. TypeScript 学习笔记 — 类型兼容 (十)

    目录 一.基本数据类型的兼容性 二.接口兼容性 三.函数的兼容性 四.类的兼容性 类的私有成员和受保护成员 五.泛型的兼容性 六.枚举的兼容性 标称类型简短介绍 TS 是结构类型系统(structur ...

  9. LevelDb-基本数据结构

    目录 Slice Arena skip list 跳表本质 时空复杂度 插入,删除数据(如何维护索引) 极端情况分析:不维护索引 极端情况分析:每次插入都维护 插入效率和查找效率取舍 删除 对比红黑树 ...

  10. 制作一个同时具有PE和Windows原版安装方式的U盘

    这个方法可能很多人已经制作成功过了,但是呢,也有些人不会的,也可能没想到过,那就是让Win PE与Windows原版安装包在一个U盘里面同时共存. 需要用到的软件有这几样:DiskGenius.Gim ...