关闭

POJ 2029 Get Many Persimmon Trees [dp]

435人阅读 评论(0) 收藏 举报

题意:

给一个矩阵,里面分布着n个星号。

给定一个小矩阵,问最大可以圈进多少个星号。

思路:

dp方程:

dp1[i][j]=dp1[i-1][j]+dp1[i][j-1]-dp1[i-1][j-1]+a[i][j];//代表从(1,1)到(j,i)圈进的星数。
dp2[i][j]=dp1[i][j]-dp1[i-ty][j]-dp1[i][j-tx]+dp1[i-ty][j-tx];//代表以(j,i)为右下角的小矩阵圈进的星数。

没什么陷阱,1A.



#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=105;
const int inf=(1<<30);
int n,m;
int ty,tx;
int a[N][N];
int dp1[N][N];
int dp2[N][N];
void solve()
{
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			dp1[i][j]=dp1[i-1][j]+dp1[i][j-1]-dp1[i-1][j-1]+a[i][j];
			dp2[i][j]=dp1[i][j]-dp1[i-ty][j]-dp1[i][j-tx]+dp1[i-ty][j-tx];
			ans=Max(ans,dp2[i][j]);
		}
	}
	printf("%d\n",ans);
}
int main()
{
	int num;
	while(scanf("%d",&num),num)
	{
		memset(a,0,sizeof(a));
		memset(dp1,0,sizeof(dp1));
		memset(dp2,0,sizeof(dp2));
		scanf("%d%d",&m,&n);
		int x,y;
		for(int i=1;i<=num;i++)
		{
			scanf("%d%d",&x,&y);
			a[y][x]=1;	
		}
		scanf("%d%d",&tx,&ty);
		solve();
	}
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:296635次
    • 积分:5039
    • 等级:
    • 排名:第5561名
    • 原创:225篇
    • 转载:13篇
    • 译文:1篇
    • 评论:26条
    最新评论