JZOJ 4743. 积木

题目

 

Description

 

 

 

Input

Output

 

 

 

Sample Input

3
8 7 6
3 9 4
1 10 5

Sample Output

18

 

 

 

Data Constraint

 

 

分析

  • 2.1 10 分做法 输出 max{a, b, c}。

  • 2.2 40 分做法 ⽣成全排列,然后枚举每个积⽊哪个⾯朝上,时间复杂度 O(n! · 3 n )。

  • 2.3 100 分做法 显然是状态压缩 DP。设计状态 f[S][i][0/1/2] 表示已经⽤了集合 S 内的积⽊,最顶上是编 号为 i 的积⽊,它的哪个⾯朝上。转移时枚举不在 S 内的积⽊,以及朝上的⾯判断即可。时间 复杂度 O(2n · (3n) 2 )。

  •    但我只会暴力,数据水,切

代码

 

 1 #include<iostream>
 2 using namespace std;
 3 int n;
 4 struct sb
 5 {
 6     int a,b,c;
 7 }a[100001];
 8 int flag[100001];
 9 int ans=0;
10 void dfs(int x,int y,int sum)
11 {
12     ans=max(ans,sum);
13     for (int i=1;i<=n;i++)
14     {
15         if (!flag[i])
16         {
17             if (a[i].a<=x&&a[i].b<=y)
18             {
19                 flag[i]=1;
20                 dfs(a[i].a,a[i].b,sum+a[i].c);
21                 flag[i]=0;
22             }
23             else if (a[i].b<=x&&a[i].a<=y)
24             {
25                 flag[i]=1;
26                 dfs(a[i].b,a[i].a,sum+a[i].c);
27                 flag[i]=0;
28             }
29             if (a[i].b<=x&&a[i].c<=y)
30             {
31                 flag[i]=1;
32                 dfs(a[i].b,a[i].c,sum+a[i].a);
33                 flag[i]=0;
34             }
35             else if (a[i].c<=x&&a[i].b<=y)
36             {
37                 flag[i]=1;
38                 dfs(a[i].c,a[i].b,sum+a[i].a);
39                 flag[i]=0;
40             }
41             if (a[i].a<=x&&a[i].c<=y)
42             {
43                 flag[i]=1;
44                 dfs(a[i].a,a[i].c,sum+a[i].b);
45                 flag[i]=0;
46             }
47             else if (a[i].c<=x&&a[i].a<=y)
48             {
49                 flag[i]=1;
50                 dfs(a[i].c,a[i].a,sum+a[i].b);
51                 flag[i]=0;
52             }
53         }
54     }
55 }
56 int main ()
57 {
58     cin>>n;
59     for (int i=1;i<=n;i++)
60        cin>>a[i].a>>a[i].b>>a[i].c;
61     for (int i=1;i<=n;i++)
62     {
63         flag[i]=1;
64         dfs(a[i].a,a[i].b,a[i].c);
65         dfs(a[i].b,a[i].c,a[i].a);
66         dfs(a[i].a,a[i].c,a[i].b);
67         flag[i]=0;
68     }
69     cout<<ans;
70 }

 

 

 

posted @ 2019-03-09 14:14  Melted_czj  阅读(116)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色