[ZOJ]3578 Matrix
考试时很诡异的考虑到了类似俄罗斯方块的情形,就像是天上不停的下高为h的俄罗斯方块,然后根据下面的方块高度来进行新的高度的判断。
很容易想到DP方程,设第i个方块能达到的高度为F[i],有F[i]=max{F[i]+H[i]},其中1<=j<=i-1,H[i]为第i个方块的高度。
判定第i,j个方块是否有重合部分只需分别对x和y坐标做判定即可。
View Code
1 #include<stdio.h>
2 #include<stdlib.h>
3 struct data{
4 int a,b,h,x,y
5 }a[1001];
6 int f[1001],n,m,c,max,i,j;
7 int judge(int i,int j)
8 {
9 if ((!((a[i].x>=a[j].x+a[j].a)||(a[i].x+a[i].a<=a[j].x)))&&(!((a[i].y>=a[j].y+a[j].b)||(a[i].y+a[i].b<=a[j].y))))
10 return 1;
11 return 0;
12 }
13 int main()
14 {
15 while (scanf("%d %d %d",&n,&m,&c)!=EOF)
16 {
17 memset(f,0,sizeof(f));
18 memset(a,0,sizeof(a));
19 for(i=1;i<=c;i++)scanf("%d %d %d %d %d",&a[i].a,&a[i].b,&a[i].h,&a[i].x,&a[i].y);
20 for(i=1;i<=c;i++)f[i]=a[i].h;
21 for(i=1;i<=c;i++)
22 for(j=i+1;j<=c;j++)
23 if ((judge(i,j))&&(f[j]<f[i]+a[j].h))
24 f[j]=f[i]+a[j].h;
25 max=0;
26 for(i=1;i<=c;i++)
27 if(f[i]>max)max=f[i];
28 printf("%d\n",max);
29 }
30 return 0;
31 }