poj2029 Get Many Persimmon Trees

来源:互联网 发布:金税盘备份的数据恢复 编辑:程序博客网 时间:2024/09/21 09:03

原题: http://poj.org/problem?id=2029

思路: 类似求矩阵中 最大子矩阵和, 在合并s行后, 求连续 t 个元素的最大和

#include<cstdio>#include<memory.h>int main(){int n;const int size=101;scanf("%d",&n);while(n!=0){int dp[size][size]={0};int w,h;scanf("%d %d",&w,&h);for(int i=1;i<=n;i++){int a,b;scanf("%d %d",&a,&b);dp[b][a]=1;}int i,j;int s,t;scanf("%d %d",&t,&s);int limit=h-s;int arr[size]={0};int m=0;int sum[size]={0};for(j=1;j<=t;j++){for(i=1;i<=s;i++)//合并s行 {arr[j]=arr[j]+dp[i][j];}sum[j]=sum[j-1]+arr[j];} m=sum[t];for(j=t+1;j<=w;j++){for(i=1;i<=s;i++)//合并s行 {arr[j]=arr[j]+dp[i][j];}sum[j]=sum[j-1]+arr[j];if(sum[j]-sum[j-t]>m){m=sum[j]-sum[j-t];}}for(int start=1;start<=limit;start++){memset(sum,0,sizeof(sum));for(j=1;j<=t;j++){arr[j]=arr[j]+dp[s+start][j]-dp[start][j];sum[j]=sum[j-1]+arr[j];} if(sum[t]>m){m=sum[t];}for(j=t+1;j<=w;j++){arr[j]=arr[j]+dp[s+start][j]-dp[start][j];sum[j]=sum[j-1]+arr[j];if(sum[j]-sum[j-t]>m){m=sum[j]-sum[j-t];}}}printf("%d\n",m);scanf("%d",&n);}return 0;}