鹰潭钢绞线厂家联系方式 2026-07-03: 区别二进制字符串的小用度。用go言语, 有个只由

 联系瑞通    |      2026-07-05 22:54
钢绞线

2026-07-03:区别二进制字符串的小用度。用go言语鹰潭钢绞线厂家联系方式,有个只由 0 和 1 构成的二进制字符串 s,以及两个代价 encCost 和 flatCost。

把字符串 s 区别红些许个流通的片断(分段)。脱手把扫数这个词字符串视为个片断;允许不息陆续把某个片断拆成两个相邻的片断,直到得到终的区别案。

对恣意某个片断,设它的长度为 L,何况该片断中 1 的数目为 X(即敏锐元素的个数):

拆分限定:

若是某个片断的长度是偶数,那么不错把它平均切成两个长度换取的流通片断。此时此次拆分产生的新总用度就是这两个子片断用度之和。

条件:在扫数繁荣限定的有区别中,求总用度的小可能值,并复返这个小总用度。

1

s 仅由 '0' 和 '1' 构成。

1

输入: s = "1010", encCost = 2, flatCost = 1。

输出: 6。

解说:

扫数这个词字符串 s = "1010" 长度为 4,包含 2 个敏锐元素,用度为 4 * 2 * 2 = 16。

由于长度为偶数,它不错被拆分为 "10" 和 "10"。每个分段长度为 2 且包含 1 个敏锐元素,因此每个分段的用度为 2 * 1 * 2 = 4,揣度 8。

将两个分段陆续拆分为四个单字符分段,得到 "1"、"0"、"1" 和 "0"。包含 "1" 的分段长度为 1 且正值有个敏锐元素,用度为 1 * 1 * 2 = 2;而包含 "0" 的分段莫得敏锐元素,因此用度为 flatCost = 1。

因此总用度为 2 + 1 + 2 + 1 = 6,这是小可能的总用度。

题目来独力扣3864。

、代码举座施行分步拆解

要领1:预解决前缀和数组,快速求恣意区间1的总和

1. 字符串长度为n,创建长度n+1的前缀和数组sum,sum[0]=0。

2. 遍历字符串每位,sum[i+1] = sum[i] + 现时字符转数字(0或1)。

3. 作用:关于恣意左闭右开区间[l, r),区间内1的总和X = sum[r] - sum[l],O(1)查询恣意片断1的数目,避重迭遍历统计。

要领2:界说递归DFS函数 dfs(l, r):求区间[l, r)片断的小总用度

函数输入l左规模、r右规模,代表原字符串从下标l到r-1的子串片断,复返该片断扫数法拆分案里的小用度,分4步施行:

分支1:现时片断全是0(X=0)

通过前缀和算出区间1总和X=sum[r]-sum[l],若X=0:

该片断不行拆分化(论长度奇偶,用度固定为flatCost),平直复返flatCost。

分支2:先计划「不拆分」案的用度

现时片断含1(X>0),不作念任何拆分、平直保留扫数这个词片断的用度:

不拆分用度 = 片断长度 × 片断1总和 × encCost

把该值行为现时临时解res。

分支3:判断是否允许拆分,若允许则计划拆分后的用度并新小值

1. 计划现时片断长度len = r - l,独一len是偶数本事对半拆分;奇数平直跳过拆分逻辑。

2. 可拆分时,取中间分割点m=(l+r)/2,把片断平分操纵两段[l,m)、[m,r)。

3. 递归分别求出左段小用度dfs(l,m)、右段小用度dfs(m,r),两段相加得到「拆分次」的总用度。

4. 对比临时解res和拆分总用度,取小的值新res。

分支4:复返现时片断的小用度res

论是否拆分,终复返该区间能得到的小用度。

要领3:进口调用与效果退换

1. 齐全字符串对应区间[0, n),调用dfs(0, n)得到整型小总用度。

2. 将效果转为int64类型复返,止数值溢出。

要领4:主函数样例施行齐全历程(s=1010,n=4)

1. 预解决前缀和:sum数组为[0,1,1,2,2]

2. 调用dfs(0,4):

• X=sum[4]-sum[0]=2≠0,片断长度4为偶数

• 不拆分用度:4×2×2=16,res开动=16

• 中点m=2,递归计划dfs(0,2) + dfs(2,4)

• 计划dfs(0,2)(子串"10",L=2,X=1)

X=1≠0,不拆分用度2×1×2=4;长度2偶数,中点m=1

递归dfs(0,1) + dfs(1,2)

• dfs(0,1)(字符1,L=1奇数):X=1鹰潭钢绞线厂家联系方式,钢绞线用度1×1×2=2,不可拆分,复返2

• dfs(1,2)(字符0,X=0):平直复返flatCost=1

两段和=3,对比原值4,新res=3,复返3

• 计划dfs(2,4)(子串"10"),逻辑同上,复返3

• 两段总和3+3=6,对比开动res=16,新res=6

3. dfs(0,4)终复返6,输出效果6,和样例匹配。

二、算法存在的能迤逦(针对原题数据领域1e5)

现时已矣是纯递归,记念化缓存:

同个区间[l,r)会被屡次重迭递归计划;当字符串长度1e5时,递归度、重迭计划爆炸,会平直栈溢出+时,仅能解决小长度测试用例。

三、时辰复杂度 & 特等空间复杂度(分两种场景)

1. 现存记念化递归版块(代码原生已矣)

时辰复杂度

设字符串长度为n,每次偶数区间齐会分裂成两个等宗子区间,酿成满二叉拆分树:

拆分树节点总和为 O(n),但记念缓存,多数区间重迭遍历,坏情况时辰复杂度为 O(2ⁿ),指数,仅n≤20可运行,n=1e5不可用。

特等空间复杂度

1. 前缀和数组:长度n+1 → O(n)

2. 递归调用栈:每次对半拆分,栈大度 log₂n

总特等空间:O(n)(前缀和数组为主项)

2. 化后加多记念化DP(适配题目n≤1e5的轨范解法,补充参考)

若加多记念化哈希/区间DP缓存每个dfs(l,r)效果,每个唯区间仅计划次:

时辰复杂度

扫数法拆分区间总和为O(n),每个区间O(1)计划,举座 O(n)

特等空间复杂度

前缀和数组O(n) + DP记念缓存O(n) + 递归栈O(logn),总空间仍为 O(n)

Go齐全代码如下:

package main

import (

"fmt"

)

func minCost(s string, encCost, flatCost int)int64 {

n := len(s)

sum := make([]int, n+1)

for i, ch := range s {

sum[i+1] = sum[i] + int(ch-'0')

}鹰潭钢绞线厂家联系方式

// 计划子串 [l, r) 的小用度,凝视区间是左闭右开,便计划

var dfs func(int, int)int

dfs = func(l, r int)int {

x := sum[r] - sum[l]

if x == 0 {

return flatCost

}

// 不拆分

res := (r - l) * x * encCost

// 拆分

if (r-l)2 == 0 {

m := (l + r) / 2

res = min(res, dfs(l, m)+dfs(m, r))

}

return res

}

returnint64(dfs(0, n))

}

func main {

s := "1010"

encCost := 2

flatCost := 1

result := minCost(s, encCost, flatCost)

fmt.Println(result)

}

Python齐全代码如下:

# -*-coding:utf-8-*-

def minCost(s: str, encCost: int, flatCost: int) -> int:

n = len(s)

# 前缀和,纪录 '1' 的个数

prefix_sum = [0] * (n + 1)

for i, ch in enumerate(s):

prefix_sum[i + 1] = prefix_sum[i] + int(ch)

# 记念化搜索,避重迭计划

memo = {}

def dfs(l: int, r: int) -> int:

# 子串为 [l, r),左闭右开

if (l, r) in memo:

return memo[(l, r)]

ones = prefix_sum[r] - prefix_sum[l]

zeros = (r - l) - ones

# 全是 0,平直压平

if ones == 0:

memo[(l, r)] = flatCost

return flatCost

# 不拆分:按位编码

res = (r - l) * ones * encCost

# 若是长度是偶数,尝试拆分

if (r - l) 2 == 0:

mid = (l + r) // 2

res = min(res, dfs(l, mid) + dfs(mid, r))

memo[(l, r)] = res

return res

return dfs(0, n)

def main:

s = "1010"

encCost = 2

flatCost = 1

result = minCost(s, encCost, flatCost)

print(result)

if __name__ == "__main__":

main

C++齐全代码如下:

#include

#include

#include

#include

#include

#include

using namespace std;

long long minCost(string s, int encCost, int flatCost) {

int n = s.length;

vector prefix_sum(n + 1, 0);

// 构建前缀和

for (int i = 0; i

prefix_sum[i + 1] = prefix_sum[i] + (s[i] - '0');

}

// 记念化搜索,使用字符串行为键存储景色

unordered_map memo;

// DFS函数

function dfs = [&](int l, int r) -> int {

// 生成景色键

string key = to_string(l) + "," + to_string(r);

if (memo.find(key) != memo.end) {

return memo[key];

}

int ones = prefix_sum[r] - prefix_sum[l];

// 全是0,平直压平

if (ones == 0) {

memo[key] = flatCost;

return flatCost;

}

// 不拆分:按位编码

int res = (r - l) * ones * encCost;

// 若是长度是偶数,尝试拆分

if ((r - l) 2 == 0) {

int mid = (l + r) / 2;

res = min(res, dfs(l, mid) + dfs(mid, r));

}

memo[key] = res;

return res;

};

return (long long)dfs(0, n);

}

int main {

string s = "1010";

int encCost = 2;

int flatCost = 1;

long long result = minCost(s, encCost, flatCost);

cout

return0;

}

咱们深信东说念主工智能为开阔东说念主提供了种“增强器用”,并奋勉于于共享全位的AI学问。在这里,您不错找到新的AI科普著作、器用评测、升迁率的秘密以及行业知悉。

迎接体恤“福大大架构师逐日题”,发音问可得到口试贵寓,让AI助力您的将来发展。天津市瑞通预应力钢绞线有限公司相关词条:离心玻璃棉     塑料挤出机     钢绞线厂家    铝皮保温    pvc管道管件胶

1.本网站以及本平台支持关于《新广告法》实施的“极限词“用语属“违词”的规定,并在网站的各个栏目、产品主图、详情页等描述中规避“违禁词”。
2.本店欢迎所有用户指出有“违禁词”“广告法”出现的地方,并积极配合修改。
3.凡用户访问本网页,均表示默认详情页的描述,不支持任何以极限化“违禁词”“广告法”为借口理由投诉违反《新广告法》鹰潭钢绞线厂家联系方式,以此来变相勒索商家索要赔偿的违法恶意行为。