2022-10-03:给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它
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];
}
执行结果如下:

2022-10-03:给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它的更多相关文章
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- 定义一个复数(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 ...
- NS2的LEACH仿真出来的nam文件拓扑的节点为什么x=0,且y=0
查看.tr文件和.nam发文件下所有的节点的x,y值都是(0,0),nam图像更没有运行出来 于是我将if { $opt(sc) == "" } {puts "*** N ...
- tensorflow学习之(一)预测一条直线y = 0.1x + 0.3
#预测一条y = 0.1x + 0.3的直线 import tensorflow as tf import numpy as np #科学计算模块 ''' tf.random_normal([784, ...
- 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都 ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- 均值为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& ...
- 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 ...
- 给定表达式[x/2] + y + x * y, 其中x,y都是正整数。
改进了一下,不过还是要十多秒吧. package com.boco.study; import java.math.BigDecimal; import java.util.Calendar; imp ...
随机推荐
- Blazor项目在VisualStudio调试时配置运行基础目录
最近在使用 Blazor 开发管理后台时遇到了如下的问题,我这里后台整体采用了 AntDesignBlazor 组件库,在上线之后发现ReuseTabs组件在使用过程中,如果默认 / 没有指定为项目的 ...
- Less1-union select 联合查询注入
在学习之前,我们要知道,什么是 SQL 注入? 一句话来说,攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的. SQL注入漏洞的危害是很大的,常常会导致整个数 ...
- 对于MyBatis的模糊查询的实现+文本框、单选框以及复选框的数据回显的实现
MyBatis的模糊查询sql语句与之前使用的不太一样 主要是利用下面这种语句实现的(查了好久的,认真记一下吧!) select * from huodong where theme like con ...
- https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!
前言 先说看了一天各种博客让我恶心的地方,恶心死了,发现每个人说的第一次发送的内容,数字证书里面包含啥,都有各种不一样!到了最后忽然想起来直接搜着报文就行了. 比如这个博客LS/SSL 协议详解 (9 ...
- uniapp微信小程序解析详情页的四种方法
一.用微信文档提供的RICH-TEXT 官方文档:微信文档rich-text 这种是直接使用: <!-->content是API获取的html代码</--> <rich- ...
- Vue-Router 路由与配置
现在的很多应用都流行SPA应用(singe page application) . 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候因受到网络.性能的影 ...
- IDEA配置JDK版本的地方, 适用于Compilation failed: internal java compiler error
错误原因: 1. 编译版本不匹配 2.当前项目jdk版本不支持 解决方法 查看项目的jdk 查看工程的jdk 查看java编译器版本 讲这些改成自己需要的版本, 一般就可以解决编译版本出现的错误
- Mybatis Plus根据某字段特定值排序
需求 背景:一个审核流程.审核人等级分为市级和省级,管理员升级字段adminlevel,字段含义:1省级,2市级.审核字段audit为int字段,字段含义:1待市级审核,2待省级审核,3通过审核. 需 ...
- BEST 定理与矩阵树定理的证明
BEST 定理:计算有向图的欧拉回路数量 欧拉图 \(G\) 的欧拉回路个数为 \(T_s(G)\prod(out_i-1)!\),其中 \(T_s(G)\) 代表以 \(s\) 为根的内向树个数,\ ...
- 一个斜杠引发的CDN资源回源请求量飙升
背景 一个安静的晚上,突然接到小伙伴电话线上CDN回源异常,具体表现为请求量飙升,且伴有少量请求404,其中回源请求量飙升已经持续两天但一直未被发现,直到最近404请求触发了告警后分析log才同时发现 ...