目录
1.一维前缀和
2.二维前缀和
一.一维前缀和
思路分析:通过计算一段数据各个位置的前一部分和 用o(1)求出一段距离的长度
核心算法:
sum[i]=sum[i-1]+a[i]
#include<iostream>
using namespace std;
int a[n+1];
int sum[n+1];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i] = sum[i-1]+a[i];
}
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r;
cout<<sum[l]-sum[r-1]<<endl;
}
return 0;
}
二.二维前缀和
核心思路:
核心分析: 用(x2,y2)左上角的部分-(x2,y-1)这一列-(x1-1,y2)这一行+(x1-1,y1-1)
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1010;
long long prefixSum[N][N];//前缀和数组
int nums[N][N];//原数组
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
{
scanf("%d",&nums[i][j]);
//二维前缀和
prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + nums[i][j];
}
//输出
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= m;j++)
{
printf("%d ",prefixSum[i][j]);
}
puts("");
}
return 0;
}