由于n很小(<=15)我们考虑状态压缩
显然可以用三进制(雾)但是太浪费了
我们令f[i][j][s]表示现在已用的积木状态为S,最上面那个积木是第i个,其中这个积木的第j(0<=j<3)条边是竖着的(不在上表面)
转移的时候枚举i'和j‘判断一下即可
由于每个积木边长顺序没有影响所以可以先排序方便比较
#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include #include using namespace std;int f[16][3][1<<16]={ 0},a[20][3]={ { 1<<30,1<<30,1<<30}},n,MS,A=0;inline void max(int& x,int y){ x =g[0] && f[1]>=g[1];}int main(){ scanf("%d",&n); MS=1<