题解
本题主要知识点如下:
1.组合数的递推公式:c(m,n)=c(m-1,n-1)+c(m-1,n)
2.用前缀和优化查询:将复杂度从O(n)降到O(1)
前缀和:
1)一维数组的前缀和:sum[i]=a[0]+…+a[i];
2)二维数组的前缀和;sum[i][j]为左上角(0,0)到右下角(i,j)矩形中的所有a[ ][ ]的和
那么前缀和sum[i][j]就等于蓝的矩阵sum[i-1][j]加上绿的矩阵sum[i][j-1],再减去重叠面积sum[i-1][j-1],最后加上小方块
即:sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + a[i][j] (记忆口诀:上加左 减左上 加自己)
代码:
#include <iostream>
using namespace std;
typedef long long ll;
int c[2005][2005];
int ans[2005][2005];
int n,m,k