JZOJ 4743. 积木
题目
分析
-
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 }
为何要逼自己长大,去闯不该闯的荒唐