看到是二維線段樹題,趕腳和POJ 1050很像,一看poj 1050 比這還難,這題用1050方法代碼要複雜一點,注意輸入矩陣的格式
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
const int N = 1e2 + 11 ;
int dp[N][N] ;
int num[N][N] ;
int n , m ;
int main() {
int t ;
while(scanf("%d" ,&t)==1 && t) {
memset(dp , 0 , sizeof(dp)) ;
memset(num , 0 , sizeof(num));
scanf("%d%d" ,&m ,&n);
int a, b ;
while(t--) {
scanf("%d%d" ,&a , &b) ;
num[b][a] = 1 ;
}
scanf("%d%d" ,&b ,&a) ;
for(int i = 1 ; i <= n ; ++i) {
for(int j = 1 ; j <= m ; ++j) {
num[i][j] += num[i][j-1] ;
dp[i][j] = num[i][j] ;
if(j > b) dp[i][j] -= num[i][j-b] ;
}
}
int Max = 0 ;
int tmp ;
for(int j = b ; j <= m ; ++j) {
for(int i = 1 ; i<= n ; ++i) {
dp[i][j] += dp[i-1][j] ;
tmp = dp[i][j] ;
if(i > a) tmp -= dp[i-a][j] ;
Max = max(tmp , Max) ;
}
}
printf("%d\n" , Max) ;
}
}