zoukankan      html  css  js  c++  java
  • 4743. 【NOIP2016提高A组模拟9.2】积木

    Description&Data Constraint

    (1le nle 15,1le a,b,cle 10^8)

    Solution

    看到 (nle15),显然状压,考虑将一个长方体分成 6 个(3 个也行),分别以不同的 (a,b,c) 作为长、宽和高。

    (f_{s,i}) 表示当前状态为 (s),最上边的是 (i)​,注意这里的 (i)(le 6 imes n) 的,因为已经分割长方体了。但是 (s) 的最大依旧是 (2^n-1),因为长方体只有一个。

    转移方程

    [f_{s|2^{i-1},i}=max(f_{s,j})+h_i;(s&2^{j-1} ot=0,s&2^{i-1}=0) ]

    最终的答案就是 (max f_{s,i})

    Code

    #pragma GCC optimize(2)
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    #define N 20
    using namespace std;
    struct node
    {
    	int id;
    	ll x,y,h;
    }a[N*6];
    int n;
    ll x,y,z,ans,f[1<<16][6*N];
    int main()
    {
    	scanf("%d",&n);
    	for (int i=1;i<=n;++i)
    	{
    		scanf("%lld%lld%lld",&x,&y,&z);
    		a[6*(i-1)+1].x=x;a[6*(i-1)+1].y=y;a[6*(i-1)+1].h=z;a[6*(i-1)+1].id=i;
    		a[6*(i-1)+2].x=x;a[6*(i-1)+2].y=z;a[6*(i-1)+2].h=y;a[6*(i-1)+2].id=i;
    		a[6*(i-1)+3].x=y;a[6*(i-1)+3].y=x;a[6*(i-1)+3].h=z;a[6*(i-1)+3].id=i;
    		a[6*(i-1)+4].x=y;a[6*(i-1)+4].y=z;a[6*(i-1)+4].h=x;a[6*(i-1)+4].id=i;
    		a[6*(i-1)+5].x=z;a[6*(i-1)+5].y=x;a[6*(i-1)+5].h=y;a[6*(i-1)+5].id=i;
    		a[6*(i-1)+6].x=z;a[6*(i-1)+6].y=y;a[6*(i-1)+6].h=x;a[6*(i-1)+6].id=i;
    	}
    	a[0].x=a[0].y=2147483647;a[0].id=1;
    	for (int s=1;s<(1<<n);++s)
    		for (int i=1;i<=6*n;++i)
    		{
    			if ((s&(1<<(a[i].id-1)))==0) continue;
    			for (int j=0;j<=6*n;++j)
    			{
    				if ((s&(1<<(a[j].id-1)))==0&&s!=0) continue;
    				if (a[i].x<=a[j].x&&a[i].y<=a[j].y) f[s][i]=max(f[s][i],f[s-(1<<(a[j].id-1))][j]+a[i].h);
    			}
    			ans=max(ans,f[s][i]);
    		}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    OC字符串处理
    用 map 表达互斥逻辑
    iOS之LLDB调试器
    iOS 线程安全 锁
    OC实现 单向链表
    iOS读取info.plist中的值
    SQLite 如何取出特定部分数据
    UIView常用的一些方法setNeedsDisplay和setNeedsLayout
    xCode常用快捷键
    oppo7.0系统手机(亲测有效)激活Xposed框架的流程
  • 原文地址:https://www.cnblogs.com/Livingston/p/15130409.html
Copyright © 2011-2022 走看看