题意:用砖块建塔,直线向上叠,地下砖块要长宽都比上面砖块大,严格递减
dp一下即可
博主有两种做法
结构体做法
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; struct Cube { int l,w,h; Cube(int ll = 0,int ww = 0,int hh = 0) { l = ll; w = ww; h = hh; } friend bool operator < (const Cube &c1,const Cube &c2) { if(c1.l != c2.l) return c1.l > c2.l; return c1.w > c2.w; } }; vector<Cube> cube; int main() { int n; int cas = 0; while(scanf("%d",&n) && n) { //num.clear();//clear()容量大小也会消失的 cube.clear(); for(int i = 0; i < n; i++) { vector<int> num(3); //注意在这里设置num大小 scanf("%d %d %d",&num[0],&num[1],&num[2]); sort(num.begin(),num.end()); do { cube.push_back(Cube(num[0],num[1],num[2])); }while(next_permutation(num.begin(),num.end())); } sort(cube.begin(),cube.end()); vector<int> dp(cube.size()); int height = cube[0].h; dp[0] = cube[0].h; for(int i = 1; i < cube.size(); i++) { // printf("cube l = %d w = %d h = %d \n",cube[i].l,cube[i].w,cube[i].h); dp[i] = cube[i].h; height = max(height,dp[i]); for(int j = i -1; j > 0; j--) { if(cube[i].l < cube[j].l && cube[i].w < cube[j].w) dp[i] = max(dp[i],dp[j] + cube[i].h); } height = max(height,dp[i]); } printf("Case %d: maximum height = %d\n",++cas,height); } return 0; }
#include<iostream> #include<sstream> #include<string> #include<vector> #include<list> #include<set> #include<map> #include<stack> #include<queue> #include<algorithm> #pragma warning(disable:4996) #include<cstdio> #include<cstdlib> using namespace std; class Cube { public: int length, width, height; Cube() { length = width = height = 0; } Cube(const int &l,const int &w,const int &h) { length = l, width=w, height = h; } friend bool operator<(const Cube &c1,const Cube &c2) { if (c1.length != c2.length) { return c1.length>c2.length; } return c1.width > c2.width; } }; int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int n,count=0; while (cin >> n&&n) { vector<Cube>cube; for (int i = 0; i < n; i++) { vector<int>dimension(3); cin >> dimension[0] >> dimension[1] >> dimension[2]; std::sort(dimension.begin(), dimension.end()); do { cube.push_back({ dimension[0],dimension[1],dimension[2] }); } while (std::next_permutation(dimension.begin(), dimension.end())); } vector<int>dp(cube.size()); std::sort(cube.begin(), cube.end()); dp[0] = cube[0].height; int height = dp[0]; for (int i = 1; i < dp.size(); i++) { dp[i] = cube[i].height; height = std::max(height, cube[i].height); for (int j = i - 1; j >= 0; j--) { if (cube[i].length < cube[j].length&&cube[i].width < cube[j].width) { dp[i] = std::max(dp[i], dp[j] + cube[i].height); } } height = std::max(height, dp[i]); } cout << "Case "<<++count<<": maximum height = "<<height << endl; } return 0; }