[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 }

 

转载于:https://www.cnblogs.com/USTC-ACM/archive/2012/02/26/2369088.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值