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. 从babel编译结果分析class的实现原理

    示例: class A { // 属性表达式 prop1 = 1; // get方法 get value() { console.log('Getting the current value!'); ...

  2. Azure DevOps - 团队成员有权限却无法看到 Azure Repo

    ​ 我们需要进入Organization Settings, 在Users中找到相关的用户,确认用户Access Level是否为stakeholder. ​ 点击最右侧三个点,Change Acce ...

  3. uglfy

    uglify: npm install uglify-js -g 或者用npm install uglify-es 运行: uglifyjs demo.js -m -o demo.min.js Ugl ...

  4. 一篇博客带你学会MyBatis

    概念 MyBatis是一款持久层框架,用于简化JDBC操作(JavaEE三层架构:表现层(用来做页面的代码),业务层(业务逻辑代码),持久层(对数据库操作的代码))(框架就是一个半成品软件,是一套可重 ...

  5. Windows 10 G 神州网信政府版

    ​神州网信政府版2018版:Win10 CMGE_V0-H.1020.000.iso校验码:9484e568c6505f9c4ad5b9fcf7ec8d83588eebfb38089f53e33011 ...

  6. 爬取网页的通用代码框架.py(亲测有效)

    import requests def getHTMLText(url): try: kv = {'user-agent':'Mozilla/5.0'} r = requests.get(url,he ...

  7. STM32F407 学习 (0) 各种外设功能 (上)

      本文对正点原子STM32F4探索者的基本功能及外设作最基本的介绍,随笔者本人的学习进程(基本按照正点原子)而不定时更新,起到总结的作用. 一.HAL库编写程序的运行逻辑   HAL库函数(如stm ...

  8. buuctf-RE-SimpleRev

    IDA 打开 将main函数反编译为C代码 1 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) ...

  9. golang 中的 cronjob

    引言 最近做了一个需求,是定时任务相关的.以前定时任务都是通过 linux crontab 去实现的,现在服务上云(k8s)了,尝试了 k8s 的 CronJob,由于公司提供的是界面化工具,使用.查 ...

  10. 单机最快的队列Disruptor解析和使用

    前言 介绍高性能队列Disruptor原理以及使用例子. Disruptor是什么? Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果.用于解决生产者 ...