ZOJ3578(Matrix)

Matrix

Time Limit: 10 Seconds       Memory Limit: 131072 KB

N*M coordinate plane ((0, 0)~(n, m)). Initially the value of all N*M grids are 0.
An operation T(a, b, h, x, y) is defined as follow:
1. Select the maximum value in the matrix (x, y) ~ (x+a, y+b), suppose the maximum value is max
2. Change all the value in the matrix (x, y) ~ (x+a, y+b) into max+h
After C operations, please output the maximum value in the whole N*M coordinate.

Input

The input consists of several cases. 
For each case, the first line consists of three positive integers N , M and C (N ≤ 1000, M ≤ 1000, C ≤ 1000). In the following C lines, each line consists of 5 non-negative number, aibihixiyi (0 ≤ hi ≤ 10000, 0 ≤ xi < n, 0 ≤ yi < m).

Output

For each case, output the maximum height.

Sample Input
3 2 2
2 1 9 1 1
1 1 2 2 1
Sample Output
11

  感受:判断两个矩阵是否相交,考虑一定不相交的情况。若考虑相交条件则是有可能相交。并且呀,不相交对立面不一定是相交啊(好人的对立面不一定是坏人啊,有可能是不好不坏的人啦,世界并不是由二元性组成的呀!)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Matrix
 7 {
 8   int x1,x2,y1,y2,maxn;
 9 };
10 Matrix matrix [1000+5];
11 bool cover(Matrix a,Matrix b)
12 {
13     if(a.x1>=b.x2||b.x1>=a.x2) return false;
14     if(a.y1>=b.y2||b.y1>=a.y2) return false;
15     return true;
16 }
17 int n,m,c;
18 int x,y,h,a,b;
19 int main()
20 {
21     while(~scanf("%d%d%d",&n,&m,&c))
22     {
23         int ans=0;
24 
25         memset(matrix,0,sizeof(matrix));
26         for(int i=0;i<c;i++)
27         {
28             int temp=0;
29             scanf("%d%d%d%d%d",&a,&b,&h,&x,&y);
30             matrix[i].x1=x;
31             matrix[i].x2=x+a;
32             matrix[i].y1=y;
33             matrix[i].y2=y+b;
34             //matrix[i].h=h;
35             for(int j=0;j<i;j++)
36             {
37                 if(cover(matrix[i],matrix[j]))
38                     temp=max(temp,matrix[j].maxn);
39             }
40             matrix[i].maxn=temp+h;
41             ans=max(ans,matrix[i].maxn);
42         }
43         printf("%d\n",ans);
44     }
45 
46 
47     return 0;
48 }
49 
50 //1 2
51 //1
52 //1 5

 

转载于:https://www.cnblogs.com/ZP-Better/p/4691596.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值