一、一维前缀和
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)