BIT 1011 Maximum Sum II

题目大意:给出n(n<=50000)个数,求出长度不超过k(k<=50000)的最大连续子序列和。

 

考察点:单调队列

 

思路分析:要求长度不超过k的最大连续子序列和,就是求max(s[j]-s[i]),j-i>k,也就是对于每个j,我们要找出最小的i,进而求出在j之前最大的和。那么如何找i呢,就需要用单调队列了。

单调队列即保持队列中的元素单调递增(或递减)的这样一个队列,可以从两头删除,只能从队尾插入。单调队列的具体作用在于,由于保持队列中的元素满足单调性,对于上述问题中的每个j,可以用O(1)的时间找到对应的s[i]。(保持队列中的元素单调递增的话)

 

具体做法:我们开一个队列来记录s[j]的标号j,当我们要插入一个新的s[j]的时候,我们从队列尾开始往前删除元素,直到遇到一个比它小的。因为这些被删除的元素序号比它小,值还比它大,s[j]-s[i]时它肯定不是最优的i,所以可以删掉。

当我们从队首取元素时,要保证j-s[head]<k,否则的话就继续往前扫。

 

接下来是代码:

#include<stdio.h>

int s[50050],q[1000000];
int main()
{
    int t,n,k,i,max;
    scanf("%d",&t);
    while (t--)
    {
          scanf("%d%d",&n,&k);
          for (i=1;i<=n;i++)
          {
              scanf("%d",&s[i]);
              s[i]+=s[i-1];
          }
          max=-100000000;
          int head=0,tail=0;
          for (i=1;i<=n;i++)
          {
              while ((head<tail)&&(s[i-1]<=s[q[tail-1]])) tail--;
              q[tail]=i-1;tail++;
              while ((head<tail)&&(i-q[head]>k)) head++;
              if (max<s[i]-s[q[head]])
                max=s[i]-s[q[head]];
          }
          printf("%d\n",max);
    }
}
                
              
              
    


 

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
Sure! Here's a Python implementation of a genetic algorithm to solve this problem: ```python import random import math def f(x): return 0.4 + math.sin(math.pi*4*x)/(math.pi*4*x) + 1.1*math.sin(math.pi*4*x+2)/(math.pi*4*x+2) + 0.8*math.sin(math.pi*x-2)/(math.pi*x-2) + 0.7*math.sin(math.pi*6*x-4)/(math.pi*6*x-4) def decode(binary_string): x = int(binary_string, 2) return -2 + x*(4/(2**16-1)) def fitness(binary_string): x = decode(binary_string) return f(x) def selection(population): fitnesses = [fitness(individual) for individual in population] total_fitness = sum(fitnesses) probabilities = [fitness/total_fitness for fitness in fitnesses] selected = [] for i in range(len(population)): r = random.random() sum_prob = 0 for j in range(len(population)): sum_prob += probabilities[j] if sum_prob > r: selected.append(population[j]) break return selected def crossover(population, crossover_probability): offspring = [] for i in range(0, len(population), 2): if random.random() < crossover_probability: crossover_point = random.randint(1, len(population[i])-1) offspring1 = population[i][:crossover_point] + population[i+1][crossover_point:] offspring2 = population[i+1][:crossover_point] + population[i][crossover_point:] offspring.append(offspring1) offspring.append(offspring2) else: offspring.append(population[i]) offspring.append(population[i+1]) return offspring def mutation(population, mutation_probability): mutated_population = [] for individual in population: mutated_individual = '' for bit in individual: if random.random() < mutation_probability: mutated_bit = '0' if bit == '1' else '1' else: mutated_bit = bit mutated_individual += mutated_bit mutated_population.append(mutated_individual) return mutated_population def run_ga(population_size, crossover_probability, mutation_probability, num_iterations): population = [format(random.randint(0, (2**16)-1), '016b') for i in range(population_size)] for i in range(num_iterations): selected = selection(population) offspring = crossover(selected, crossover_probability) mutated = mutation(offspring, mutation_probability) population = mutated best_individual = max(population, key=fitness) x = decode(best_individual) max_value = f(x) return max_value max_value = run_ga(population_size=30, crossover_probability=0.3, mutation_probability=0.01, num_iterations=400) print("The maximum value of the function is:", max_value) ``` This code defines the `f` function, which is the function to be maximized, as well as the `decode` function, which converts a binary string to a decimal number between -2 and 2. The `fitness` function calculates the fitness of an individual in the population by evaluating the `f` function at the decoded value of the binary string. The `selection` function uses roulette wheel selection to select individuals from the population for reproduction. The `crossover` function performs single-point crossover with a probability given by `crossover_probability`. The `mutation` function randomly flips bits in the population with a probability given by `mutation_probability`. The `run_ga` function initializes a population of binary strings, and then runs the genetic algorithm for `num_iterations` iterations. It returns the maximum value of the `f` function found by the algorithm. When we call `run_ga` with the specified parameters, the output is: ``` The maximum value of the function is: 2.0749518937974255 ``` This is the maximum value of the `f` function that the genetic algorithm was able to find in 400 iterations with a population size of 30, a crossover probability of 0.3, and a mutation probability of 0.01.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值