題意:有n(n≤30)種立方體,每種有無窮多個。要求選一些立方體摞成一根盡量高的柱子(可以自行選擇哪一條邊作為高),使得每個立方體的底面長寬分別嚴格小於它下方立方體的底面長寬。
樣例輸入:
1 10 20 30
2 6 8 10
5 5 5
7 1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5 31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0樣例輸出:
case 1: maximum height = 40
case 2: maximum height = 21
case 3: maximum height = 28
case 4: maximum height = 342
思路:
決定結果的永遠是最上面的那乙個立方體,可以用二元組來表示這個底面長和寬,每增加一層導致長和寬都會減少,符合dag模型,可以套用最長路演算法。
有乙個問題是立方體的長和寬可能會很大,所以這裡建議採用標記序號的方式來代替二元組的兩個值,例如狀態(3,1)表示的就是第三個立方體,高度為這組值的第乙個值。
**:
#include
#include
using
namespace
std;
#define max 1024
bool g[max][max];
int dp[max][max], a[max][5];
struct node arr[max];
int t;
int n;
bool init()
sort(a[i], a[i] + 4);
arr[++t].x = a[i][1];
arr[t].y = a[i][2];
arr[t].z = a[i][3];
arr[++t].x = a[i][1];
arr[t].y = a[i][3];
arr[t].z = a[i][2];
arr[++t].x = a[i][2];
arr[t].y = a[i][3];
arr[t].z = a[i][1];}}
memset(dp, -1, sizeof(dp));
return
true;
}void creat()
}int f(int up, int down)
if (ans == -1)ans = arr[up].z + arr[down].z;
return ans;
}int main(void)
cout
<< maxn << endl;
}system("pause");
return
0;}
我還見到了另一種解法,說是可以用最長上公升子串行的方法來解決,我是沒理解,這裡只貼上**吧。在貼之前先寫上最長上公升子串行的**吧,畢竟我經常忘記。
#include
#include
using
namespace
std;
#define max 100
int num[max];
int a[max];
int n;
int f(int x) }}
return best;
}int main(void)
巴比倫塔的lis解法:
#include
using
namespace
std;
const
int n = 35;
struct block
bk[n * 3];
int n;
int d[n * 3];
int cmp(block a, block b)
int main()
sort(bk, bk + k, cmp);
int m = 0;
for (int i = 0; i < k; i++)
} if (d[i] > m)
m = d[i];
} printf("case %d: maximum height = %d\n", cas++, m);
} }
lis**取自: uva437 巴比倫塔
題意 見紫書 題解 一道水得不能再水的大水題,卻讓我給想多了 每種立方體的長寬高有6種不同的情況,把輸入的拆成6個來考慮 用最長上公升子串行的思維,狀態轉移方程 dp i max dp i dp j p i h 因為開始時立方體是無序的,所以按長或者寬或者什麼神奇的東西拍個序 使能夠讓第i個立方體堆...
27 巴比倫塔 UVa 437
有n n 30 n n 30 n n 30 種立方體,每種都有無窮多個。要求選一些立方體摞成一根盡量高的柱子 可以自行選擇哪一條邊作為高 使得每個立方體的底面長寬分別嚴格小於它下方立方體的底面長寬。include include include include using namespace std...
紫書 UVa437巴比倫塔
題解 這個就是矩形巢狀的改變,把2d變為3d了,然後加1變為加上他們的高度 注意點是乙個矩形可以有三種不同的形態 include include include using namespace std int n int p 儲存各個矩形的數量,乙個矩形有三種 struct juxju 910 in...