實用演算法實現 第 10 篇 動態規劃

2021-05-28 15:54:57 字數 1766 閱讀 2365

pku judgeonline, 1160, post office.

一條直線上分布著v個村莊。要在這些村莊中的某些村莊裡建一共p個郵局,使得村莊到離它最近的郵局的距離之和最小。輸出這個的最小距離之和。

10512 3 6 7 9 11 22 44 50

思路:用opt[i][j]記錄把前i個郵局建到前j個村莊中的最優解,用cost[i][j]記錄所有在i到j村莊中,建1個郵局的最小代價。顯然郵局應該設到中點。讓前i個郵局覆蓋前j個村莊,第i+1個郵局覆蓋第j+1至j+k個村莊(j+k<=n),則狀態轉移方程為:

opt[i+1][j+k]=min (k+j<=n)

cost陣列存放從i到j中有乙個郵局的最小代價,顯然該郵局應該放在中間。

opt[i][j] 表示前i個郵局覆蓋前j個村莊的最小代價,對於i=1來說,opt[i][j] = cost[i][j],讓前2個郵局覆蓋前j個村莊,也就是i=2的情況,可能是一下情況的最優解:第乙個郵局覆蓋第乙個村莊,第二個村莊覆蓋2-j個村莊,或者第乙個郵局覆蓋第1-2個村莊,第二個村莊覆蓋3-j個村莊,第乙個郵局覆蓋第1-3個村莊,第二個村莊覆蓋4-j個村莊,等等等等。

#include #include int  distance[303];

int cost[303][303];

int opt[303][303];

int main()

memset(cost, 0, sizeof(cost));

for(i =1; i <= v; i++)

cost[i][j] += temp;

}

}} memset(opt, 0x7f, sizeof(opt));

opt[0][0] = 0;

for(i =0; i <= p; i++)}}

}}

cout << opt[p][v] << endl;

}return 1;

}

lcs問題在《演算法導論》中有著詳盡的分析。

需要注意的是乙個串的lcs並不是唯一的。

pku judgeonline, 1458, common subsequence.

給定兩個字串,求兩者的最長公共子串行的長度。

abcfbc         abfcab

programming    contest

abcd           mnp42

這是基本的lcs問題。問題並不複雜,因為這裡不需要構造乙個lcs,而只需求出lcs的長度。

#include #include using namespace std;

int c[1000][1000];

charx[10000];

chary[10000];

int main()

else}}

cout << c[m-1][n-1] <

pku judgeonline, 1160, post office.

pku judgeonline, 1014, dividing.

pku judgeonline, 1157, little shop offlowers.

pku judgeonline, 3356, agtc.

pku judgeonline, 1080, human genefunctions.

pku judgeonline, 2250, compromise.

pku judgeonline, 1458, common subsequence.

實用演算法實現 第 10 篇 動態規劃

pku judgeonline,1160,post office.一條直線上分布著v個村莊。要在這些村莊中的某些村莊裡建一共p個郵局,使得村莊到離它最近的郵局的距離之和最小。輸出這個的最小距離之和。10512 3 6 7 9 11 22 44 50 思路 用opt i j 記錄把前i個郵局建到前j個...

實用演算法實現 第 15 篇 對抗搜尋

人工智慧,一種現代方法 對於對抗搜尋的介紹非常好。極大值極小值策略是一種最優策略。當對手不犯錯誤時,最優策略能夠導致至少不比其它任何其它策略差的結果。需要注意的是,最優策略針對的是最優化對手 如果使用極大值極小值策略對付非最優化對手,可能沒有使用其它策略好,但是使用那些策略對付最優化對手必定要比極大...

演算法 動態規劃篇 第5節 剪繩子問題

演算法 動態規劃篇 第1節 0 1揹包問題 演算法 動態規劃篇 第2節 數字矩陣問題 演算法 動態規劃篇 第3節 數字三角形問題 演算法 動態規劃篇 第4節 硬幣找零問題 演算法 動態規劃篇 第5節 剪繩子問題 演算法 動態規劃篇 第6節 最低票價問題 演算法 動態規劃篇 第7節 最長子串問題 演算...