โจทย์ข้อนี้สามารถแก้ได้ด้วยเทคนิค dynamic programming โดยนิยาม คือผมรวมของทุกตำแหน่ง ที่ และ จะได้ ค่าช่อง โดย preprocess ค่าของทุกๆ เอาไว้ จากนั้นการหาค่ามากที่สุดในทุกๆสี่เหลี่ยมขนาด โดยสี่เหลี่ยมขนาด ใดที่มีมุมขวาล่างอยู่ที่ตำแหน่ง สามารถหาได้จากการนำ ก็จะสามารถหาคำตอบได้โดยมี Time complexity
#include <bits/stdc++.h> using namespace std; int m, n, k, sum[1010][1010], ans; int main() { scanf("%d %d %d",&m,&n,&k); for( int i = 1 ; i <= m ; i++ ){ for( int j = 1 ; j <= n ; j++ ){ scanf("%d",&sum[i][j]); sum[i][j] += sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]; } } for( int i = k ; i <= m ; i++ ){ for( int j = k ; j <= n ; j++ ){ ans = max( ans, sum[i][j] - sum[i-k][j] - sum[i][j-k] + sum[i-k][j-k] ); } } printf("%d",ans); }