还有河北城乡和住房建设厅网站吗,app 网站开发公司,网页设计代码大全添加音乐,做科技申报看什么网站正题 题目大意
有长方体积木nnn块#xff0c;求能搭成的最高高度。 解题思路
考虑状态压缩#xff0c;设fs,i,jf_{s,i,j}fs,i,j表示积木使用状态为sss#xff0c;最下面的是第iii块#xff0c;状态为jjj#xff1a;
状态#xff1a;对于一个长方体a,b,ca,b,ca,b,c a…正题 题目大意
有长方体积木nnn块求能搭成的最高高度。 解题思路
考虑状态压缩设fs,i,jf_{s,i,j}fs,i,j表示积木使用状态为sss最下面的是第iii块状态为jjj
状态对于一个长方体a,b,ca,b,ca,b,c
a∗ba*ba∗b的底a∗ca*ca∗c的底b∗cb*cb∗c的底
首先枚举状态然后枚举当前放哪个然后枚举上次放哪个然后枚举最上面哪个的放置状态然后暴力动态转移。
时间复杂度O(2n∗n2)O(2^n*n^2)O(2n∗n2) codecodecode
#includecstdio
#includealgorithm
#includecstring
using namespace std;
const int N17;
struct node{int a,b,c;
}c[N];
int f[1N][N][3],MS,n,ans;
bool check(int x,int y,int l,int w)
{return xlyw||xwyl;}
int main()
{scanf(%d,n);for(int i1;in;i)scanf(%d%d%d,c[i].a,c[i].b,c[i].c);MS(1n);for(int s0;sMS;s){for(int i1;in;i){if(s(1(i-1))) continue;int mbs|(1(i-1));for(int j1;jn;j)for(int k0;k3;k){int l,w;if(k0) lc[j].a,wc[j].b;else if(k1) lc[j].a,wc[j].c;else lc[j].b,wc[j].c;if(check(c[i].a,c[i].b,l,w))f[mb][i][0]max(f[mb][i][0],f[s][j][k]c[i].c);if(check(c[i].a,c[i].c,l,w))f[mb][i][1]max(f[mb][i][1],f[s][j][k]c[i].b);if(check(c[i].b,c[i].c,l,w))f[mb][i][2]max(f[mb][i][2],f[s][j][k]c[i].a);}}}//1-a*b 2-a*c 3-b*cfor(int i1;in;i)for(int k0;k3;k)ansmax(ans,f[MS-1][i][k]);printf(%d,ans);
}