編輯:關於Android編程
A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the banana by placing one block on the top another to build a tower and climb up to get its favorite food.
The researchers have n types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions (xi, yi, zi). A block could be reoriented so that any two of its three dimensions determined the dimensions of the base and the other dimension was the height.
They want to make sure that the tallest tower possible by stacking blocks can reach the roof. The problem is that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly smaller than the corresponding base dimensions of the lower block because there has to be some space for the monkey to step on. This meant, for example, that blocks oriented to have equal-sized bases couldn't be stacked.
Your job is to write a program that determines the height of the tallest tower the monkey can build with a given set of blocks.
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
題目大意:n個磚塊,以層疊的方式堆起來,求能堆的最大高度,限制條件是,位於上面的磚塊兩條邊必須小於下面的磚塊,給猴子留位置攀登。
思路:
這個問題是典型的DAG圖的dp問題,由於磚塊每種都是無限的,並且可以隨意放,可以將每種磚塊的三種擺放形式都當成,一種,這種共有3n個磚塊了,
該問題跟矩形嵌套問題類似,即求從編號i出發能堆出的最大的高度(不包括i磚塊),dp(i) = max(dp(j) + j的高度; j是能放在i上面的磚塊編號),算法設計不難,主要是很多細節問題,比較蛋疼,如將開始節點看成地板最大高度為無窮大,結果就為dp(0);
代碼如下:
#include#include #include using namespace std; int box[100][3]; int height[100]; int number; //轉換磚塊為三種類型 void change(int index,int a,int b,int c) { box[index][0] = a; box[index][1] = b; box[index][2] = c; }//dp int DP(int j) { int& ans = height[j]; //搜索過直接返回 if(ans != -1)return ans;//搜索每一層 for(int i = 1; i <= number; i++) { if(i!=j) { if((box[i][0] < box[j][0] && box[i][1] < box[j][1]) || (box[i][1] < box[j][0] && box[i][0] < box[j][1])) { int temp = DP(i) + box[i][2]; if(temp > ans) ans = temp; } } }//未更新,說明是最後一層。 if(ans == -1) ans = 0; return ans; } int main() { int n; int Case = 0; while(cin >> n && n) { int a,b,c; number = 0; //地板看成無窮大磚塊。 box[0][0] = box[0][1] = box[0][2] = INT_MAX; for(int i = 1; i <= n; i++) { cin >> a >> b >> c; change(++number,a,b,c); change(++number,b,c,a); change(++number,c,a,b); } for(int i = 0; i <= number; i++) { height[i] = -1; } cout << "Case " << ++Case << ": maximum height = " << DP(0) << endl; } return 0; }
簡介這裡主要介紹Android生成一個Json格式的字符串,客戶端通過網絡獲取服務器端生成的Json字符串進行解析,根據解析出來的Url去網絡獲取圖片並顯示在ListVi
前言這篇文章是這個系列的開篇,作為移動開發者,開發的應用不免會對網絡進行訪問,雖然現在已經有很多的開源庫幫助我們可以輕而易舉的訪問網絡,但是我們仍要去了解網絡訪問的原理,
1.效果圖 2.創建頁面文件(main.xml) 3.創建下拉框的數據源 List list = new A
上一篇博客,我們已經得到了文件夾列表,我們需要對文件列表子項添加事件,比如我們點擊的是文件,就執行 打開操作,點擊的是文件夾執行打開文件夾操作,遍歷文件清單,以此類推直到