<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
題目描述:
大家都知道斐波那契數列,現在要求輸入一個正整數 n ,請你輸出斐波那契數列的第 n 項。
解題思路:
1.遞迴
2.動態規劃
狀態:F(n)
狀態遞推:F(n)=F(n-1)+F(n-2)
初始值:F(1)=F(2)=1
返回結果:F(N)
程式碼實現:
法一:遞迴(效率低):
class Solution{public: int Fibonacci(int n) { // 初始值 if (n <= 0) { return 0; } if (n == 1 || n == 2) { return 1; } // F(n)=F(n-1)+F(n-2) return Fibonacci(n - 2) + Fibonacci(n - 1); }};
法二:動態規劃
class Solution { public: int Fibonacci(int n) { if(n==1 || n==2) return 1; int fn; int fn1 = 1, fn2 = 1; for(int i = 2; i < n; i++) { fn = fn1 + fn2; fn1 = fn2; fn2 = fn; } return fn; /*上述解法的空間複雜度為O(n) 其實F(n)只與它相鄰的前兩項有關, 所以沒有必要儲存所有子問題的解 只需要儲存兩個子問題的解就可以 下面方法的空間複雜度將為O(1)*/ if(n==1 || n==2) return 1; int* F = new int[n]; //初始狀態 F[0] = 1; F[1] = 1; for(int i = 2; i < n; i++) { F[i] = F[i-1] + F[i-2]; } return F[n-1]; } };
題目描述:
給定一個字串s和一組單詞dict,判斷s是否可以用空格分割成一個單詞序列,使得單詞序列中所有的單詞都是dict中的單詞(序列可以包含一個或多個單詞)。
例如:
給定s=“nowcode”;
dict=[“now”, “code”].
返回true,因為"nowcode"可以被分割成"now code".
解題思路:
狀態:
狀態遞推:
初始值:
返回結果:F(n)
程式碼實現:
class Solution { public: bool wordBreak(string s, unordered_set<string> &dict) { int len = s.size(); vector<bool> F(len+1, false); F[0] = true; for(int i = 1; i <= len; i++) { //F[8]的狀態:7<8 && F[7] && [8,8] //F[8]的狀態:6<8 && F[6] && [7,8] for(int j = i-1; j >= 0; j--) { if(F[j] && dict.find(s.substr(j,i-j)) != dict.end()) { F[i] = true; break; } } } return F[len]; } };
題目描述:
給出一個三角形,計算從三角形頂部到底部的最小路徑和,每一步都可以移動到下面一行相鄰的數位
例如,給出的三角形如下:
[[20],[30,40],[60,50,70],[40,10,80,30]]
解題思路:
狀態:子狀態:從(0,0)到(1,0),(1,1),(2,0),…(n,n)的最短路徑和 F(i,j): 從(0,0)到(i,j)的最短路徑和
狀態遞推: F(i,j) = min( F(i-1, j-1), F(i-1, j)) + triangle[i][j]
初始值: F(0,0) = triangle[0][0]返回結果: min(F(n-1, i))
程式碼實現:
class Solution { public: int minimumTotal(vector<vector<int> > &triangle) { if(triangle.empty()) return 0; int row = triangle.size(); vector<vector<int> > minSum(triangle); for(int i = 1; i < row; i++) { for(int j = 0; j <= i; j++) { if(j == 0) minSum[i][j] = minSum[i-1][j] + triangle[i][j]; else if(j == i) minSum[i][j] = minSum[i-1][j-1] + triangle[i][j]; else minSum[i][j] = min(minSum[i-1][j], minSum[i-1][j-1]) + triangle[i][j]; } } int result = minSum[row-1][0]; for(int i = 1; i < triangle.size(); i++) { result = min(result, minSum[row-1][i]); } return result; } };
題目描述:
一個機器人在m×n大小的地圖的左上角(起點)。 機器人每次可以向下或向右移動。機器人要到達地圖的右下角(終點)。 可以有多少種不同的路徑從起點走到終點?
解題思路:
狀態:子狀態:從(0,0)到達(1,0),(1,1),(2,1),…(m-1,n-1)的路徑數 F(i,j): 從(0,0)到達F(i,j)的路徑數
狀態遞推: F(i,j) = F(i-1,j) + F(i,j-1)
初始化: 特殊情況:第0行和第0列 F(0,i) = 1 F(i,0) = 1
返回結果: F(m-1,n-1)
程式碼實現:
class Solution { public: /** * * @param m int整型 * @param n int整型 * @return int整型 */ int uniquePaths(int m, int n) { // write code here vector<vector<int> > ret(m, vector<int>(n,1)); for(int i = 1; i < m; i++) { for(int j = 1; j < n; j++) { ret[i][j] = ret[i-1][j] + ret[i][j-1]; } } return ret[m-1][n-1]; } };
題目描述:
給定一個由非負整數填充的m x n的二維陣列,現在要從二維陣列的左上角走到右下角,請找出路徑上的所有數位之和最小的路徑。 注意:你每次只能向下或向右移動。
解題思路:
狀態:子狀態:從(0,0)到達(1,0),(1,1),(2,1),…(m-1,n-1)的最短路徑 F(i,j): 從(0,0)到達F(i,j)的最短路徑。
狀態遞推: F(i,j) = min{F(i-1,j) , F(i,j-1)} + (i,j)
初始化: F(0,0) = (0,0) 特殊情況:第0行和第0列 F(0,i) = F(0,i-1) + (0,i) F(i,0) = F(i-1,0) + (i,0)
返回結果: F(m-1,n-1)
程式碼實現:
class Solution { public: /** * * @param grid int整型vector<vector<>> * @return int整型 */ int minPathSum(vector<vector<int> >& grid) { // write code here if(grid.size() == 0 || grid[0].size() == 0) return 0; int M = grid.size(); int N = grid[0].size(); vector<vector<int> > ret(M, vector<int>(N,0)); ret[0][0] = grid[0][0]; for(int i = 1; i < N; i++) { ret[0][i] = ret[0][i-1] + grid[0][i]; } for(int i = 1; i < M; i++) { ret[i][0] = ret[i-1][0] + grid[i][0]; } for(int i = 1; i < M; i++) { for(int j = 1; j < N; j++) { ret[i][j] = min(ret[i-1][j],ret[i][j-1]) + grid[i][j]; } } return ret[M-1][N-1]; } };
到此這篇關於C++ 動態規劃演演算法使用分析的文章就介紹到這了,更多相關C++ 動態規劃內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45