首页 > 其他分享 >2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 :

2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 :

时间:2023-07-02 22:00:12浏览次数:40  
标签:10 int 相加 相邻 数组 序列 长度 sum

2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1

再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2

这样下去可以最终只剩一个数字

比如 :

3 1 2 4

4 3 6

7 9

16

现在如果知道N,和最后的数字sum,反推最原始的序列是什么

如果有多个答案,返回字典序最小的那个

字典序看做所有数字拼起来的字符串字典序

比如

1, 10, 2... 拼起来是 1102...

1, 2, 3, 4... 拼起来是 1234...

认为 1, 10, 2...的字典序更小

如果给定的n和sum,有答案,返回一个N长度的答案数组

如果给定的n和sum,无答案,返回一个1长度的数组{ -1 }

输入 : N = 4, sum = 16

输出 : 3 1 2 4

输入 : N = 10, sum = 4116

输出 : 1 3 5 7 10 9 8 6 4 2

答案2023-07-02:

大体步骤如下:

1.创建一个二维动态数组dp,大小为(1<<(n+1))x(sums[n]+1)

2.定义一个变量status,其初始值为((1 << (n + 1)) - 1) ^ 1

3.如果n小于1或大于10,或者sum大于sums[n],则返回数组[-1]

4.调用process函数处理状态status、剩余和rest、索引index、长度n、模数组modulus和动态数组dp,得到结果ans

5.如果ans的值为-1,说明无法找到合适的序列,返回数组[-1]

6.创建一个长度为n的答案数组ans,并初始化index为0,restsum

7.当status不等于0时,执行以下循环:

  • dp[status][rest]的值赋给ans[index]

  • status异或上1 << ans[index],更新status

  • rest减去ans[index] * modulus[index],更新rest

  • index加1。

8.返回答案数组ans

总的时间复杂度:O(2^N * sum),其中N为输入的n,sum为输入的sum。
总的空间复杂度:O(2^N * sum),包括二维动态数组dp的空间。

go语言代码如下:

package main

import "fmt"

var moduluses = [][]int{
	{},
	{1},
	{1, 1},
	{1, 2, 1},
	{1, 3, 3, 1},
	{1, 4, 6, 4, 1},
	{1, 5, 10, 10, 5, 1},
	{1, 6, 15, 20, 15, 6, 1},
	{1, 7, 21, 35, 35, 21, 7, 1},
	{1, 8, 28, 56, 70, 56, 28, 8, 1},
	{1, 9, 36, 84, 126, 126, 84, 36, 9, 1},
}

var sums = []int{0, 1, 3, 9, 24, 61, 148, 350, 808, 1837, 4116}

func lsp(n int, sum int) []int {
	if n < 1 || n > 10 || sum > sums[n] {
		return []int{-1}
	}
	dp := make([][]int, 1<<(n+1))
	for i := range dp {
		dp[i] = make([]int, sums[n]+1)
	}
	status := ((1 << (n + 1)) - 1) ^ 1
	if !process(status, sum, 0, n, moduluses[n], dp) {
		return []int{-1}
	}
	ans := make([]int, n)
	index := 0
	rest := sum
	for status != 0 {
		ans[index] = dp[status][rest]
		status ^= 1 << ans[index]
		rest -= ans[index] * moduluses[n][index]
		index++
	}
	return ans
}

func process(status int, rest int, index int, n int, modulus []int, dp [][]int) bool {
	if rest < 0 {
		return false
	}
	if status == 0 {
		return rest == 0
	}
	if dp[status][rest] != 0 {
		return dp[status][rest] != -1
	}
	ans := -1
	if n == 10 && (status&(1<<10)) != 0 {
		if process(status^(1<<10), rest-modulus[index]*10, index+1, n, modulus, dp) {
			ans = 10
		}
	}
	if ans == -1 {
		for i := 1; i <= n; i++ {
			if (status & (1 << i)) != 0 {
				if process(status^(1<<i), rest-modulus[index]*i, index+1, n, modulus, dp) {
					ans = i
					break
				}
			}
		}
	}
	dp[status][rest] = ans
	return ans != -1
}

func main() {
	N1 := 4
	sum1 := 16
	ans1 := lsp(N1, sum1)
	for _, num := range ans1 {
		fmt.Printf("%d ", num)
	}
	fmt.Println()

	N2 := 10
	sum2 := 4116
	ans2 := lsp(N2, sum2)
	for _, num := range ans2 {
		fmt.Printf("%d ", num)
	}
	fmt.Println()

	N3 := 10
	sum3 := 3688
	ans3 := lsp(N3, sum3)
	for _, num := range ans3 {
		fmt.Printf("%d ", num)
	}
	fmt.Println()

	N4 := 10
	sum4 := 4013
	ans4 := lsp(N4, sum4)
	for _, num := range ans4 {
		fmt.Printf("%d ", num)
	}
	fmt.Println()
}

在这里插入图片描述

在这里插入图片描述

标签:10,int,相加,相邻,数组,序列,长度,sum
From: https://www.cnblogs.com/moonfdd/p/17521513.html

相关文章

  • 【剑指Offer】44、反转单词序列
    【剑指Offer】44、反转单词序列题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student.aamI”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的......
  • 2. 两数相加
    给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。示例1:输入:l1=[2,4,3],l2=[5,6,4]输出:[7,0......
  • 纵横循环序列数
    问题:生成一个纵横周期为40的循环序列数。函数公式解决:=MOD(COLUMN(A1)+ROW(A39),40)+1思路:循环序列数的模式化公式(纵向)是:=Mod(Row(A周期),周期)+1周期为40的公式是:=MOD(ROW(A40),40)+1再要加上横向,即在Mod的第一个参数里再加一个Column(A1),但这样一来,第一个参数的......
  • 开源通用高性能的分布式id序列组件
    原文地址:https://ntopic.cn/p/2023062101/Gitee源代码仓库:https://gitee.com/obullxl/sequence-jdbcGitHub源代码仓库:https://github.com/obullxl/sequence-jdbc分布式id序列说明业务数据的存储,少不了数据记录的id序列。id序列(或称序列)的生成方式有很多种,比如当前时间戳、......
  • 时间序列预测-基于LSTM-CNN的人体活动识别
    本文主要利用LSTM和CNN来处理移动传感器产生的数据识别人类活动。传感器数据集数据组成这个项目使用了WISDM(WirelessSensorDataMining)Lab实验室公开的Actitracker的数据集其中数据:测试记录:1,098,207条行为类型:6种走路慢跑上楼梯下楼梯坐站立传感器类......
  • 会声会影2023最新六大新功能,会声会影2023序列号能用多少次
    会声会影2023版是一款非常实用的视频剪辑软件,该软件能够为广大用户带来丰富的集成化工具,并且优化了工作流程,无论你是新手还是老手都可以快速上手这款软件。会声会影2022永久激活版支持自定义码率设置,用户可以根据自己的需求设定视频画质,并且优化了分屏剪辑功能,简化多时间轴编辑的工......
  • CNN GRU 注意力 时序预测 基于加注意力机制(CNN-GRU-Attention)的时间序列预测程序,预测
    CNNGRU注意力时序预测基于加注意力机制(CNN-GRU-Attention)的时间序列预测程序,预测精度很高。可用于做风电功率预测,电力负荷预测,交通预测,负荷预测,经济预测,排放预测等标记注释清楚,可直接换数据运行。代码实现训练与测试精度分析。原创文章,转载请说明出处,资料来源:http://imgcs.......
  • 题解 P8757 [蓝桥杯 2021 省 A2] 完美序列
    题解P8757[蓝桥杯2021省A2]完美序列题意如果一个序列是单调递减的,而且除了第一个数以外的任何一个数都是上一个数的因数,则称这个序列为一个完美序列。一个序列中的一个子序列如果是完美序列,则称为该序列的一个完美子序列。一个序列的最长完美子序列长度,称为该序列的完美......
  • R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证
    全文链接:http://tecdat.cn/?p=31162最近我们被客户要求撰写关于SV模型的研究报告,包括一些图形和统计输出本文做SV模型,选取马尔可夫蒙特卡罗法(MCMC)、正则化广义矩估计法和准最大似然估计法估计。模拟SV模型的估计方法: sim<-svsim(1000,mu=-9,phi=0.97,sigma=0.15)......
  • 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法
    [matlab]10种经典的时间序列预测模型本文演示了10种不同的经典时间序列预测方法,它们是1)自回归(AR)2)移动平均线3)自回归移动平均线4)自回归积分移动平均线(ARIMA)5)季节性自回归积分移动平均线(SARIMA)6)具有外生回归量的季节性自回归综合移动平均线(SARIMAX)......