**:
機械人rob在乙個有n*n 個方格的方形區域f 中收集樣本。(i,j)方格中樣本的價值為v(i,j),如下圖所示
rob 從方形區域f 的左上角a點出發,向下或向右行走,直到右下角的b 點,在走過的路上,收集方格中的樣本。rob 從a點到b 點共走2次,試找出rob 的2條行走路徑,使其取得的樣本總價值最大。給定方形區域f 中的樣本分佈,程式設計計算rob 的2條行走路徑,使其取得的樣本總價值最大。由檔案input.txt給出輸入資料。第1 行有1 個正整數n,表示方形區域f有n*n 個方格。接下來每行有3 個整數,前2 個表示方格位置,第3個數為該位置樣本價值。最後一行是3個0。
由於機械人只能往右走或向下走,所以如果每個位置走過後,它左邊或上邊的點就不需要考慮了。每個機械人到達終點時都經過2*n-2步。可以設h[x1][y1][x2][y2] 表示第乙個機械人到達(x1,y1)第二個機械人走到(x2,y2)時的最優值。如果現在為第s步,如果某個機器的x座標被確定,那麼它的y座標也可以推出來(有x+y = s)。於是我們可以有在第由第s步的最大值去更新s+1步的最大值即可。
而在s步時,可以根據所在的兩個位置選擇乙個方向進行推導(共四個,每個機械人往下或往右)。更新時需要注意如果兩個機械人走到同乙個格仔時,它的值只更新一次(每個樣本只能收集一次)。
現在只剩下乙個難點:為什麼這樣遞推是正確的?
我們使用的是第s步推導第s+1步,我們知道在第s步時,它左邊,上邊的方格我們己經不會再使用了,而s+1步所更新的值的位置在它的右邊與下邊,這樣我們就保證了更新的時候沒有哪一次把某個方格的值取了兩次(如果兩個機械人走向同乙個方格,需要特殊判斷)。這樣就保證了演算法的正確性。
#include
#include
usingnamespacestd;
#define maxn 22
inth
[maxn
][maxn
][maxn
][maxn
];intv
[maxn
][maxn
];intn;
voidupdate(intx1
,inty1
,intx2
,inty2
,intval)
else
}intmain()
memset(h,0
,sizeof(h));h[
0][0][
0][0]
=v[0
][0];/*
此題最重要的思路是以機械人總共走多少步為物件,由x座標來確定y座標
*/for(ints =
0; s <
2* n -
2; ++s) }}
printf("%d/n"
,h[n -
1][n -
1][n -
1][n -
1]);
return0;}
收集樣本問題(num)
演算法 dp 分析 跟傳紙條是乙個題,只不過本題算上了起點和終點,即從起點出發也要算上起點,因此在最後再加上起點和終點位置上的值即可。program num const maxn 9 var n longint a array 0.maxn,0.maxn of longint f array 0.m...
樣本收集問題JAVA實現
機械人rob 從方形區域f 的左上角a點出發,向下或向右行走 直到右下角的b 點,在走過的路上,收集方格中的樣本。rob 從a點到b 點共走2次,試找出rob 的2條行走路徑,使其取得的樣本總價值最大。input 第1 行有1 個正整數n,表示方形區域f有n n 個方格。接下來每行有3 個整數,前2...
樣本非平衡問題
正負樣本比例為100 1 甚至1000 1,需要在分布如此不均勻的資料集中學習到有用資訊。造成分類器在多數類精度較高,少數類的分類精度很低。以最大分類精度為目標,導致演算法提高多數樣本分類精度而忽略小樣本的 精度。原因 以邏輯回歸為例,以優化總體精度為目標,不同類別的誤分類情況產生的誤差相同,考慮乙...