POJ 2029 水DP

看到是二維線段樹題,趕腳和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) ;
	}
}


發佈了48 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章