2つのトラバーサルを使用して、グリッド内の最大ポイントを収集します
各セルにポイントがあるマトリックスがあり、2つのトラバーサルを使用してそのグリッドから最大ポイントを取得する方法。
-
を満たすためのいくつかの条件があります- 最初の走査は、グリッドの左上のセルから始まり、左下隅に移動する必要があります。そして、右上隅から右下隅への2回目のトラバーサルで
- 1つのセルから、現在のセルの左下、左下、および現在のセルの右下にのみ移動できます。
- 1つのトラバーサルがすでにセルからいくつかのポイントを取得している場合、次のトラバーサルではそのセルからポイントは取得されません。
入力と出力
Input: A grid with points. 3 6 8 2 5 2 4 3 1 1 20 10 1 1 20 10 1 1 20 10 Output: Maximum points collected by two traversals is 73. From the first traversal, it gains: 3 + 2 + 20 + 1 + 1 = 27 From the second traversal, it gains: 2 + 4 + 10 + 20 + 10 = 46
アルゴリズム
findMaxVal(mTable, x, y1, y2)
入力- 記憶テーブルとしての3D配列、x値およびy1、y2。
出力- 最大値。
Begin if x, y1 and y2 is not valid, then return - ∞ if both traversal is complete, then if y1 = y2, then return grid[x, y1] else return grid[x, y1] + grid[x, y2] if both traversal are at last row, then return - ∞ if subProblem is solved, then return mTable[x, y1, y2] set res := - ∞ if y1 = y2, then temp := grid[x, y1] else temp := grid[x, y1] + grid[x, y2] res := max of res and (temp + findMaxVal(mTable, x+1, y1, y2-1)) res := max of res and (temp + findMaxVal(mTable, x+1, y1, y2+1)) res := max of res and (temp + findMaxVal(mTable, x+1, y1, y2)) res := max of res and (temp + findMaxVal(mTable, x+1, y1-1, y2)) res := max of res and (temp + findMaxVal(mTable, x+1, y1-1, y2-1)) res := max of res and (temp + findMaxVal(mTable, x+1, y1-1, y2+1)) res := max of res and (temp + findMaxVal(mTable, x+1, y1+1, y2)) res := max of res and (temp + findMaxVal(mTable, x+1, y1+1, y2-1)) res := max of res and (temp + findMaxVal(mTable, x+1, y1+1, y2+1)) return true if mTable[x, y1, y2] = res Endの場合にtrueを返します。
例
#include<iostream> #define ROW 5 #define COL 4 using namespace std; int grid[ROW][COL] = { {3, 6, 8, 2}, {5, 2, 4, 3}, {1, 1, 20, 10}, {1, 1, 20, 10}, {1, 1, 20, 10}, }; bool isValidInput(int x, int y1, int y2) { return (x >= 0 && x < ROW && y1 >=0 && y1 < COL && y2 >=0 && y2 < COL); } int max(int a, int b) { return (a>b)?a:b; } int findMaxVal(int mTable[ROW][COL][COL], int x, int y1, int y2) { if (!isValidInput(x, y1, y2)) //when in invalid cell, return -ve infinity return INT_MIN; if (x == ROW-1 && y1 == 0 && y2 == COL-1) //when both traversal is complete return (y1 == y2)? grid[x][y1]: grid[x][y1] + grid[x][y2]; if (x == ROW-1) //both traversal are at last row but not completed return INT_MIN; if (mTable[x][y1][y2] != -1) //when subproblem is solved return mTable[x][y1][y2]; int answer = INT_MIN; //initially the answer is -ve infinity int temp = (y1 == y2)? grid[x][y1]: grid[x][y1] + grid[x][y2]; //store gain of the current room //find answer for all possible value and use maximum of them answer = max(answer, temp + findMaxVal(mTable, x+1, y1, y2-1)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1, y2+1)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1, y2)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1-1, y2)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1-1, y2-1)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1-1, y2+1)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1+1, y2)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1+1, y2-1)); answer = max(answer, temp + findMaxVal(mTable, x+1, y1+1, y2+1)); return (mTable[x][y1][y2] = answer); //store the answer in the mTable and return. } int findMaxCollection() { // Create a memoization table and set all values as -1 int mTable[ROW][COL][COL]; for(int i = 0; i<ROW; i++) for(int j = 0; j<COL; j++) for(int k = 0; k<COL; k++) mTable[i][j][k] = -1; return findMaxVal(mTable, 0, 0, COL-1); } int main() { cout << "Maximum collection is " << findMaxCollection(); return 0; }
出力
Maximum collection is 73
-
OpenCV Javaライブラリを使用して2つの画像の要点を一致させる方法は?
detect() org.opencv.features2d.Feature2Dのメソッド (抽象)クラスは、指定された画像の要点を検出します。この方法では、マットを渡す必要があります ソース画像と空のMatOfKeyPointを表すオブジェクト 読み取りキーポイントを保持するオブジェクト。 drawMatches() org.opencv.features2d.Feature2Dのメソッド クラスは、指定された2つの画像のキーポイント間の一致を見つけて、それらを描画します。このメソッドは、次のパラメーターを受け入れます- src1 −マットのオブジェクト 最初のソース画像を
-
Pythonを使用して2つの変数を交換する方法は?
一時変数を使用する- >>> x=10 >>> y=20 >>> z=x >>> x=y >>> y=z >>> x,y (20, 10) 一時変数を使用せずに >>> a,b=5,7 >>> a,b (5, 7) >>> a,b=b,a >>> a,b (7, 5)