zoj 3578 Matrix DP

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4600

题目意思很简单,但一般的方法会超时的。这里用的是DP看解题报告做不来的....

View Code
 1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 #include <cmath>
5 using namespace std;
6 struct ss{
7 int a,b,h,x,y;
8 }num[1005];
9 int judge(int i,int j)//判断两个区域是否有相交 这里的等号要特别注意
10 {
11 if(!((num[i].x>=num[j].x+num[j].a)||(num[i].x+num[i].a<=num[j].x))&&!((num[i].y>=num[j].y+num[j].b)||num[i].b+num[i].y<=num[j].y))
12 return 1; //区域有相交
13 return 0;
14 }
15 int main()
16 {
17 int n,m,i,j,c,ma;
18 int f[1005];
19 while (scanf("%d%d%d",&n,&m,&c)!=EOF)
20 {
21 memset(num,0,sizeof(num));
22 memset(f,0,sizeof(f));
23 for (i=1;i<=c;i++)
24 scanf("%d%d%d%d%d",&num[i].a,&num[i].b,&num[i].h,&num[i].x,&num[i].y);
25 for(i=1;i<=c;i++) f[i]=num[i].h;
26 for (i=1;i<=c;i++)
27 for(j=i+1;j<=c;j++)
28 {
29 if(judge(i,j)&&f[j]<f[i]+num[j].h)
30 f[j]=f[i]+num[j].h;
31 }
32 ma=-1;
33 for(j=1;j<=c;j++)
34 if(f[j]>ma)ma=f[j];
35 printf("%d\n",ma);
36 }
37 return 0;
38 }

 

posted @ 2012-03-27 21:19  我们一直在努力  阅读(160)  评论(0编辑  收藏  举报