思路:
步驟一:1號牛選擇時,首先選1號牛欄;
步驟二:2號牛選擇時,發現1號牛欄已經被1號牛選擇,能否給1號牛找乙個新的位置?1號牛可以找到3;
故2號牛可選擇1;斷開舊的匹配,看是否能找到?
步驟三:按照步驟一和步驟二操作;
不過,程式設計的過程比較麻煩,如何儲存中間表量和利用呢?
首先肯定有結果陣列
int result = new int[n+1];
再就是狀態陣列;
int state = new int[n+1];0代表沒有搜尋過,1代表已經搜尋過;
遞迴演算法的本質:先執行層,再執行外層;
public int getmaxmatch(map> datas, int n)
if (find(item, datas, result, state) == 1)
}return count;
}int find(int cow, map> datas, int result, int state) }}
return 0;
}
測試:
mapdata = new hashmap<>();
data.put(1, arrays.aslist(1,3,5));
data.put(2, arrays.aslist(1,4));
data.put(3, arrays.aslist(2, 5));
data.put(4, arrays.aslist(3, 4));
data.put(5, arrays.aslist(2, 4, 5));
system.out.println(new solve().getmaxmatch(data, 5));
map> data1 = new hashmap<>();
data1.put(1, arrays.aslist(2));
data1.put(2, arrays.aslist(2));
system.out.println(new solve().getmaxmatch(data1, 2));
結果:51
演算法需要認證思考細節,看著簡單,其實狀態為何這麼處理?需要思考清楚,相當於挪位置。正是遞迴的特點,先算裡層才能這麼幹。
求陣列中最大值和次最大值的較優演算法
先讓最大值為陣列首元素,然後用max和陣列的每乙個值進行比較,若小則交換,此時將max的舊值給次最大值submax。但如果陣列中最大值在遍歷前就已經找到,那麼submax將不再更新,所以在max值不更新的時候,要將submax與最近遍歷到的陣列與元素進行更新,以保證submax得到陣列中的次大值 如...
最大值和次大值問題的最優演算法
輸入 n個數,最壞情況下用 n logn 2 次比較找出當中的最大值和次大值。解題思想 根據題意出現 logn 則肯定用到二分或者堆的思路,但是輸入的數沒有經過排序,而且題目要求的計算量也不允許排序。這樣,就肯定會用到類似堆的思路,但是直接構造堆等同於排序。堆的思想跟競標賽類似,都是父節點 子節點。...
STL演算法 02最小值和最大值
min element b,e 返回乙個迭代器 min element b,e,op max element b,e max element b,e,op 第三個引數op可寫可不寫,max element 和min element 預設是從小到大排列,然後max element 輸出最後乙個值,mi...