動態規劃續集

2021-09-25 04:40:52 字數 2617 閱讀 2873

遇到矩陣,網路,字串間的比較題,單序列(一維)動規解決不了的情況下,就需要考慮雙序列(二維)動規。

機械人在(m*n)網格的左上角,可以向下,向右走,走到網格的右下角,有多少種可能的路徑。

狀態:f(i,j):走到(i,j)時有多少種可能的路徑

遞推:中間:f(i,j) = f(i-1,j)+f(i,j-1)

初始化:

第0列:f(i,0) = 1;

第0行:f(0,i) = 1;

返回結果:

f(m-1)(n-1)

#include#includeusing namespace std;

int uniquepaths(int m, int n)

} return path[m - 1][n - 1];

}int main()

機械人走網格,網格上有坑,不能走

【0,0,0】

【0,1,0】

【0,0,0】

1不能走,共有兩條路徑

狀態:f(i,j):從(0,0)走到(i,j)時有多少種可能的路徑

遞推:中間:f(i,j):if (i,j)==1 —>f(i,j) = 0

else f(i,j)= f(i-1,j)+f(i,j-1)

初始化:同樣要判斷(i,j)是否為1,如果為1,後面就都去不了了,因為只能往右,往下走

第0列:f(i,0) = 1;

第0行:f(0,i) = 1;

返回結果:

f(m-1)(n-1)

#include#includeusing namespace std;

int uniquepathswithobstacles(vector> & obstaclegrid)

//第一行

for (int i = 0; i < n; i++)

//遞推

for (int i = 1; i < m; i++) }

return paths[m - 1][n - 1];

}int main()

,, };

cout << uniquepathswithobstacles(obstaclesgrid) << endl;

system("pause");

return 0;

}

乙個非負矩陣,從左上角到右下角的最小路徑和

狀態:f(i,j):從(0,0)到(i,j)的最小路徑和

遞推:第一行:f(0,i)=f(0,i-1)+(i,j)

第一列:f(i,0)=f(i-1,0)+(i,j)

其他位置:f(i,j) = min(f(i-1,j), f(i,j-1))+ (i,j)

初始化:f(0,0) = (0,0)

返回結果:f(m-1,n-1)

#include#include#includeusing namespace std;

int findminboard(vector> & board)

} //返回結果

return min_sum[m - 1][n - 1];

}int main()

,, };

cout << findminboard(board) << endl;

system("pause");

return 0;

}

有乙個字串s,把s分割成一系列的子串,分割的每乙個子串都為回文串,返回最小的分割次數(回文串左右對稱)。

狀態:f(i):前i個字元的最小分割數

遞推:j#include#include#includeusing namespace std;

bool ispal(string s, int i, int j)

return true;

}int minofcut(string & s)

} return is_pal;

}int minofcut(string & s)

初始化:空狀態–空串

f(i,0)=i 字串轉化為空串,刪除操作

f(0,i)=i 空串轉化為字串,插入操作

返回結果:f(m,n)

#include#include#include#includeusing namespace std;

int mindistance(string word1, string word2)

插入 刪除 替換

min_dis[i][j] = min(min_dis[i - 1][j], min_dis[i][j - 1]) + 1;

if (word1[i - 1] == word2[j - 1])

min_dis[i][j] = min(min_dis[i][j], min_dis[i - 1][j - 1]);

else

min_dis[i][j] = min(min_dis[i][j], min_dis[i - 1][j - 1]+1);

} }//返回結果

return min_dis[m][n];

}int main()

給定兩個字串s和t,求s有多少個不同的子串行與t相同,子串行可以不連續,但是相對位置不能變

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...

《動態規劃》 ACM 動態規劃例題詳解

描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...