ZOJ 1093 Monkey and Banana

简单的DP,跟那个白书上面的嵌套矩形的模型完全一样。记忆化搜索。本人写的时候还是小心翼翼的,因为练的不是很多。

题目就是搬砖啊,搬砖。。。生来就是搬砖的命啊。

View Code
  1 #include <iostream>
2 #include <algorithm>
3 using namespace std;
4 class Block
5 {
6 public:
7 int l;
8 int w;
9 int h;
10 };
11 int edg[40][3];//记录每一块砖头的规格
12 int g[100][100];//邻接矩阵
13 int d[100];//dp数组
14 int i,j,k,nblock;
15 Block block[100];
16 int cmp(Block a,Block b)
17 {
18 if(a.l == b.l)
19 return a.w < b.w;
20 return a.l < b.l;
21 }
22 int if_edg(int a,int b)//返回值为1的话表示a的长宽均大于b
23 {
24 int ok = 1;
25 if(block[a].w <= block[b].w)
26 {
27 ok = 0;
28 return ok;
29 }
30 if(block[a].l <= block[b].l)
31 {
32 ok = 0;
33 return ok;
34 }
35 return ok;
36 }
37 int dp(int i)
38 {
39 int &ans = d[i];
40 if(ans > 0)
41 return ans;
42 ans = block[i].h;
43 for(int j = 1;j <= nblock * 3;j++)
44 {
45 if(g[i][j])
46 if(dp(j) + block[i].h > ans)
47 ans = dp(j) + block[i].h;
48 }
49 return ans;
50 }
51 int main()
52 {
53 int ncase = 1;
54 while(cin>>nblock)
55 {
56 if(nblock == 0)
57 break;
58 for(i = 0;i < 100;i++)
59 for(j = 0;j < 100;j++)
60 g[i][j] = 0;
61 for(i = 0;i < 100;i++)
62 d[i] = 0;
63 for(i = 1;i <= nblock;i++)
64 {
65 for(j = 0;j <= 2;j++)
66 cin>>edg[i][j];
67 sort(edg[i],edg[i] + 3);
68 }
69 /*for(i = 1;i <= nblock;i++)
70 {
71 for(j = 0;j <= 2;j++)
72 cout<<edg[i][j]<<" ";
73 cout<<endl;
74 }
75 cout<<endl;//看看砖头的规格排序以后的结果*/
76 for(i = 1,j = 1;i <= nblock;i++)//构造各种砖头
77 {
78 block[j].l = edg[i][2];
79 block[j].w = edg[i][1];
80 block[j].h = edg[i][0];
81 j++;
82 block[j].l = edg[i][2];
83 block[j].w = edg[i][0];
84 block[j].h = edg[i][1];
85 j++;
86 block[j].l = edg[i][1];
87 block[j].w = edg[i][0];
88 block[j].h = edg[i][2];
89 j++;
90 }
91 sort(block + 1,block + 3 * nblock + 1,cmp);
92 /*for(i = 1;i <= nblock * 3;i++)//看看构造出来的砖头怎么样
93 {
94 cout<<block[i].l<<" "<<block[i].w<<" "<<block[i].h<<endl;
95 }*/
96 for(i = 1;i <= nblock * 3;i++)
97 for(j = 1;j <= nblock * 3;j++)
98 if(if_edg(i,j))
99 g[i][j] = 1;
100 /*for(i = 1;i <= nblock * 3;i++)
101 {
102 for(j = 1;j <= nblock * 3;j++)
103 {
104 cout<<g[i][j]<<" ";
105 }
106 cout<<endl;
107 }*/
108 for(i = 1;i <= nblock * 3;i++)
109 dp(i);
110 /*for(i = 1;i <= nblock * 3;i++)
111 cout<<d[i]<<" ";*/
112 int max = -1;
113 for(i = 1;i <= nblock * 3;i++)
114 if(d[i] > max)
115 max = d[i];
116 cout<<"Case "<<ncase++<<": maximum height = "<<max<<endl;
117 }//while
118 return 0;
119 }
原文地址:https://www.cnblogs.com/zhexipinnong/p/2435294.html