1. 程式人生 > >洛谷P1369 【矩形】題解

洛谷P1369 【矩形】題解

  作為標籤黨的我首先點開標籤:貪心~~好有道理的樣子~~   再來看資料範圍座標100以內,n<=300,~~資料好水的樣子~~   於是我想列舉左上角和右下角的點,然後再加一遍迴圈,蠢裡蠢氣的交了上去,結果全T~~美滋滋~~。  於是冷靜分析,這是100的5次方,肯定不能過啊。但是好像100的4次方能過哦,於是結合最大加權矩形的做法:首先用一個數組記錄以(1,1)為左上角,(i,j)為右下角的矩形的權值和。   然後再來列舉左上角,右下角的座標(100的4次方),通過東拼西湊,算出矩形的權值和,然後按相同操作算出除去邊界的小矩形的權值,就是邊界的值了(即邊界上點的個數)   題目應該沒有提高+這麼難的。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans=0;
int a[101][101];
int main()
{
	scanf("%d",&n);
	for(register int i=1;i<=n;i++)
	{
	    int x,y;
	    scanf("%d%d",&x,&y);
	    a[x][y]+=1;//一個點就是一個1的權值
	}
	for(register int x=1;x<=100;x++)
	for(register int y=1;y<=100;y++)
	a[x][y]+=a[x-1][y]+a[x][y-1]-a[x-1][y-1];//記錄以(1,1)為左上角,(x,y)為右下角的矩形的權值和
	for(register int i=1;i<=99;i++)
	for(register int j=1;j<=99;j++)
	for(register int x=i+1;x<=100;x++)
	for(register int y=j+1;y<=100;y++)
	{
	    int sum1=a[x][y]-a[x][j-1]-a[i-1][y]+a[i-1][j-1];//(大矩形的權值和)應該很好理解吧,不能理解的可以畫個圖感性理解,理性分析一下
	    int sum2=a[x-1][y-1]-a[x-1][j]-a[i][y-1]+a[i][j];//小矩形的權值和,同上
	    sum1-=sum2;//邊界的值 邊界上點的個數
	    ans=ans<sum1?sum1:ans;//和ans比較大小
	}
	printf("%d",ans);
	return 0;
}