my code:
/*
* 2029.cpp
*
* Created on: 2011-7-6
* Author:
*/
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100 + 5;
bool tree[MAXN][MAXN] = {}; //坐标上是否有树
int d[MAXN][MAXN] = {}; //一维矩阵上的树的总数(坐标表示1*1元)
int ans[MAXN][MAXN] = {}; //s * t 矩阵上的树的总数(坐标表示1*1元)
int imax = -1;
int main(){
int n, w, h, s, t;
while(cin >> n){
if(n == 0)
break;
cin >> w >> h;
memset(tree, 0, sizeof(bool) * MAXN * MAXN);
int tmp_x, tmp_y;
for(int i=0; i<n; i++){
cin >> tmp_x >> tmp_y;
tree[tmp_x][tmp_y] = 1;
}
cin >> s >> t;
memset(d, 0, sizeof(int) * MAXN * MAXN);
memset(ans, 0, sizeof(int) * MAXN * MAXN);
imax = -1;
for(int i=1; i<=w-s+1; i++){
for(int j=1; j<=h; j++){
for(int k=0; k<s; k++){
d[i][j] += tree[i+k][j];
}
}
}
for(int i=1; i<=w-s+1; i++){
for(int j=1; j<=h-t+1; j++){
for(int k=0; k<t; k++){
ans[i][j] += d[i][j+k];
}
if(imax < ans[i][j])
imax = ans[i][j];
}
}
cout << imax << endl;
}
return 0;
}
其他code:【转】
1) DP
思路:基础DP。预处理存所有矩形[(1,1)(i,j)]里面的树的总数量。枚举小矩形的位置,然后DP,状态转移方程:ans = max(dp[i][j] - dp[ii-1][j] - dp[i][jj-1] + dp[ii-1][jj-1])。也可以用树状数组,但是没这个必要,树状数组能修改点的情况,这里每个点的情况是固定的。
源代码:(312K, 16MS)
#include<iostream>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int MAX = 105;
int map[MAX][MAX];
int dp[MAX][MAX];
int main(){
int n, i, j, ii, jj;
int W, H, w, h;
while(cin >> n && n){
memset(map, 0, sizeof(map));
memset(dp, 0, sizeof(dp));
cin >> W >> H;
while(n --){
int x, y;
cin >> x >> y;
map[y][x] = 1;
}
cin >> w >> h;
for(i = 1; i <= H; i ++)
for(j = 1; j <= W; j ++)
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + map[i][j];
int ans = 0;
for(i = 1; i <= H; i ++)
for(j = 1; j <= W; j ++){
ii = i - h + 1;
jj = j - w + 1;
if(ii < 1 || jj < 1) continue;
ans = max(ans, dp[i][j] - dp[ii-1][j] - dp[i][jj-1] + dp[ii-1][jj-1]);
}
cout << ans << endl;
}
return 0;
}
2) 树状数组
感觉这样用树状数组,也有点小暴力~~
#include<iostream>
#include<cstring>
using namespace std;
const int N = 105;
int c[N][N];
int lowbit(int x)
{
return x&(-x);
}
void update(int x, int y)
{
for(int i = x; i < N; i+=lowbit(i))
for(int j = y; j < N; j+=lowbit(j))
c[i][j]++;
}
int sum(int x, int y)
{
int ans = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
ans += c[i][j];
return ans;
}
void init()
{
memset(c,0,sizeof(c));
}
int main()
{
int n,w,h,x,y;
while(cin>>n && n)
{
init();
cin>>w>>h;
for(int i = 0; i < n; i++)
{
cin>>x>>y;
update(x,y);
}
cin>>x>>y;
int ans = 0;
for(int i = 1; i <= w-x+1; i++)
for(int j = 1; j <= h-y+1; j++)
{
ans = max(ans,sum(i+x-1,j+y-1)+sum(i-1,j-1)-sum(i+x-1,j-1)-sum(i-1,j+y-1));
}
cout<<ans<<endl;
}
return 0;
}