2.2.6蓝桥杯——前缀和

 一、一维前缀和

1、一维前缀和实现

 实现一:

#a的前缀和:
def get_persum(a):#下表从0开始
    n=len(a)
    summ=[0]*n
    summ[0]=a[0]
    for i in range(1,n):
        summ[i]=summ[i-1]+a[i]
    return summ
#快速求出求区间a[l]+....+a[r]的和
def get_sum(summ,l,r):
    if l==0:
        return summ[r]
    else:
        return summ[r]-summ[l-1]

a=[1,2,3,4,5]
summ=get_persum(a)
print("a=",a)
print("summ=",summ)
print(get_sum(summ,2,3))

实现二:

#a的前缀和:
from itertools import accumulate
def get_persum(a):#下表从0开始
    summ=list(accumulate(a))
    return summ
#快速求出求区间a[l]+....+a[r]的和
def get_sum(summ,l,r):
    if l==0:
        return summ[r]
    else:
        return summ[r]-summ[l-1]

a=[1,2,3,4,5]
summ=get_persum(a)
print("a=",a)
print("summ=",summ)
print(get_sum(summ,2,3))

2、例如:

注意:问题有区间就用前缀和

(1、

import os
import sys

# 请在此输入您的代码
from itertools import accumulate
mod=1000000007
#a的前缀和:
def get_persum(a):#下表从0开始
    summ=list(accumulate(a))#summ=list(accumulate(a))
    summ=[s%mod for s in summ]
    return summ
#快速求出求区间a[l]+....+a[r]的和
def get_sum(summ,l,r):
    if l==0:#l==0
        return summ[r]
    else:
        return (summ[r]-summ[l-1]+mod)%mod
n,m=map(int,input().split())
a=list(map(int,input().split()))
#存储a数组的前缀和,a数组的平方的前缀和...
sum_list=[]
for i in range(1,6):
    tmp_a=[x**i for x in a]
    sum_list.append(get_persum(tmp_a))#get_persum(tmp_a)
for _ in range(m):
    l,r,k=map(int,input().split())
    #因l,r的下表从一开始的
    print(get_sum(sum_list[k-1],l-1,r-1))

(2、

from itertools import accumulate
def get_persum(a):
    summ=list(accumulate(a))#list
    return summ
def get_sum(summ,l,r):
    if l==0:
        return summ[r]
    else:
        return summ[r]-summ[l-1]
s=input()
n=len(s)
a=[]
for i in s:
    if i=='L':
        a.append(1)
    else:
        a.append(-1)
summ=get_persum(a)
ans=0
for l in range(n):#左遍历
    for r in range(l,n):
        if get_sum(summ,l,r)==0:
            ans=max(ans,r-l+1)
print(ans)

二、二维前缀和

1、二维前缀和定义

2、求二维前缀和

# #输出一个二维矩阵list
def output(a,n):
    for i in range(1,n+1):
        print(" ".join(map(str,a[i][1:])))#每行输出出来
n,m=map(int,input().split())
#下标从一开始的矩阵n*m,因为下标从1开始(n+1)*(m+1)
a=[[0]*(m+1) for i in range(n+1)]
summ=[[0]*(m+1) for i in range(n+1)]
#输入一个二维数组a
for i in range(1,n+1):#1,n+1
    # 标从1开始,则下标0填充0
    a[i]=[0]+list(map(int,input().split()))#list()
output(a,n)
for i in range(1,n+1):#(1,n+1)
    for j in range(1,m+1):#(1,m+1)
        summ[i][j]=summ[i-1][j]+summ[i][j-1]-summ[i-1][j-1]+a[i][j]#summ[i][j]
output(summ,n)

3、快速求矩阵的和

 例题:

#70%分数
n,m,k=map(int,input().split())
a=[[0]*(m+1) for i in range(n+1)]
summ=[[0]*(m+1) for i in range(n+1)]
for i in range(1,n+1):#(1,n+1)
    a[i]=[0]+list(map(int,input().split()))#a[i]
#预处理二维前缀和
for i in range(1,n+1):
    for j in range(1,m+1):
        summ[i][j]=summ[i-1][j]+summ[i][j-1]-summ[i-1][j-1]+a[i][j]

#求矩阵[x1,y1],[x2,y2]的所有元素之和
def get_sum(summ,x1,y1,x2,y2):
    return summ[x2][y2]-summ[x1-1][y2]-summ[x2][y1-1]+summ[x1-1][y1-1]
#记录所有数的矩阵和不超过给定整数k
ans=0
#枚举左上角
for x1 in range(1,n+1):
    for y1 in range(1,m+1):
        #枚举右上角
        for x2 in range(x1,n+1):
            for y2 in range(y1,m+1):
                if get_sum(summ,x1,y1,x2,y2)<=k:
                    ans+=1
print(ans)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值