NOI 1101. 子矩阵求和(高效方法,解决超时问题)

来源:互联网 发布:双十一红包 淘宝联盟 编辑:程序博客网 时间:2024/06/04 01:33

NOI 1101.子矩阵求和,题目如下:此题目并不难,但是如果用双重循环或者递归求解时总是超时,所以用动态规划先把数据准备好.

代码如下:

#include<iostream>
using namespace std;
void fun_1101(){
int n, m;//n行m列
cin >> n >> m;


int** a = new int*[n+1];//矩阵数组
a[0] = new int[m];
for (int i = 1; i <= n; i++)
{
a[i] = new int[m]{0};
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];//矩阵数组读数据
}
}


// 第0行和第0列不是矩阵数据, 全置0是为了后面的通式不用判断
for (int i = 0; i <= n; i++)
{
a[i][0] = 0;
}
for (int i = 0; i <= m; i++)
{
a[0][i] = 0;
}


// 把矩阵a[i][j]转成表示左上角矩阵元素的和
//【1】按行迭代,求行的和
for (int i = 1; i <= n; i++)
{
for (int j = 2; j <= m; j++)
{
a[i][j] += a[i][j - 1];
}
}


//【2】按列迭代,求所有元素和
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
a[i][j] += a[i - 1][j];
}
}


int t;
cin >> t;
while (t--){
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
//最终矩阵和的公式(减去左边,减去右边,加上重复减的左上角)
int res = a[x2][y2] - a[x1-1][y2] - a[x2][y1-1] + a[x1-1][y1-1];

cout << res << endl;
}


}
int main()
{
fun_1101();
return 0;
}

原创粉丝点击