面经分享的一些动态规划题合集 发表于 2022-06-09 | 分类于 算法 , 动态规划 , 面经中出的动态规划面试题合集 | 牛客网面经中的一些动态规划面试题 983.最低票价123456789101112131415161718192021222324252627class Solution {public: int mincostTickets(vector<int>& days, vector<int>& costs) { //动态规划 dp[i]表示到第 i 天结束时的最低消费 //状态转移方程: //如果第 i 天需要通行证: // dp[i]=min(dp[i-1]+costs[0], dp[i-7]+costs[1], dp[i-30]+costs[2]); //如果第 i 天不需要通行证:dp[i] = dp[i-1]; int n=days.size(); int lastDay = days[n-1]; vector<int> dp(lastDay+1, 0); int index = 0; for(int i=1;i<=lastDay;i++){ if(i==days[index]){ int day1 = i-1>0 ? i-1 : 0; int day2 = i-7>0 ? i-7 : 0; int day3 = i-30>0 ? i-30 : 0; dp[i]=min(dp[day1]+costs[0], min(dp[day2]+costs[1], dp[day3]+costs[2])); index++; }else{ dp[i] = dp[i-1]; } } return dp[lastDay]; }}; 12345678910111213141516171819202122232425262728293031323334353637383940func mincostTickets(days []int, costs []int) int { //动态规划 dp[i]表示到第 i 天结束时的最低消费 //状态转移方程: //如果第 i 天需要通行证: // dp[i]=min(dp[i-1]+costs[0], dp[i-7]+costs[1], dp[i-30]+costs[2]); //如果第 i 天不需要通行证:dp[i] = dp[i-1]; n := len(days) lastDay := days[n-1] dp := make([]int, lastDay+1) index := 0 for i := 1; i <= lastDay; i++ { if i == days[index] { day1 := i - 1 if day1 < 0 { day1 = 0 } day2 := i - 7 if day2 < 0 { day2 = 0 } day3 := i - 30 if day3 < 0 { day3 = 0 } dp[i] = min(dp[day1]+costs[0], min(dp[day2]+costs[1], dp[day3]+costs[2])) index++ } else { dp[i] = dp[i-1] } } return dp[lastDay]}func min(a, b int) int { if a < b { return a } return b} 221.最大正方形1234567891011121314151617181920212223242526272829class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { //动态规划 //dp[i][j]表示以(i,j)为右下角,且只包含1的正方形的边长最大值 //状态转移方程:dp[i][j]=min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1 //还要考虑边界条件,如果i和j至少有一个为0,则dp[i][j]=1 int m=matrix.size(); int n=matrix[0].size(); if(m==0 || n==0) return 0; int maxSide=0; vector<vector<int>> dp(m, vector<int>(n)); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(matrix[i][j]=='1'){ if(i==0 || j==0){ dp[i][j]=1; }else{ dp[i][j]=min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1])+1; } maxSide = max(maxSide, dp[i][j]); } } } return maxSide * maxSide; }}; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051func maximalSquare(matrix [][]byte) int { //动态规划 //dp[i][j]表示以(i,j)为右下角,且只包含1的正方形的边长最大值 //状态转移方程:dp[i][j]=min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1 //还要考虑边界条件,如果i和j至少有一个为0,则dp[i][j]=1 m := len(matrix) if m == 0 { return 0 } n := len(matrix[0]) if n == 0 { return 0 } maxSide := 0 dp := make([][]int, m) for i := range dp { dp[i] = make([]int, n) } for i := 0; i < m; i++ { for j := 0; j < n; j++ { if matrix[i][j] == '1' { if i == 0 || j == 0 { dp[i][j] = 1 } else { dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1 } if dp[i][j] > maxSide { maxSide = dp[i][j] } } } } return maxSide * maxSide}func min(a, b int) int { if a < b { return a } return b}func max(a, b int) int { if a > b { return a } return b} 剑指 Offer II 098. 路径的数目12345678910111213141516171819202122class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> dp(m, vector<int>(n)); ///base case for(int i=0;i<m;i++){ dp[i][0]=1; } for(int i=0;i<n;i++){ dp[0][i]=1; } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ dp[i][j]=dp[i-1][j]+dp[i][j-1]; } } return dp[m-1][n-1]; }}; 12345678910111213141516171819202122func uniquePaths(m int, n int) int { dp := make([][]int, m) for i := range dp { dp[i] = make([]int, n) } ///base case for i := 0; i < m; i++ { dp[i][0] = 1 } for i := 0; i < n; i++ { dp[0][i] = 1 } for i := 1; i < m; i++ { for j := 1; j < n; j++ { dp[i][j] = dp[i-1][j] + dp[i][j-1] } } return dp[m-1][n-1]} 62. 不同路径12345678910111213141516171819202122class Solution {public: int uniquePaths(int m, int n) { //动态规划 dp[i][j]表示达到i,j位置总共的路径数 vector<vector<int>> dp(m, vector<int>(n)); //base case for(int i=0;i<m;i++){ dp[i][0]=1; } for(int j=0;j<n;j++){ dp[0][j]=1; } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ dp[i][j]=dp[i-1][j]+dp[i][j-1]; } } return dp[m-1][n-1]; }}; 12345678910111213141516171819202122func uniquePaths(m int, n int) int { //动态规划 dp[i][j]表示达到i,j位置总共的路径数 dp := make([][]int, m) for i := range dp { dp[i] = make([]int, n) } //base case for i := 0; i < m; i++ { dp[i][0] = 1 } for j := 0; j < n; j++ { dp[0][j] = 1 } for i := 1; i < m; i++ { for j := 1; j < n; j++ { dp[i][j] = dp[i-1][j] + dp[i][j-1] } } return dp[m-1][n-1]} -------------本文结束 感谢阅读------------- 本文作者: HReina 本文链接: http://hreina.com/2022/06/09/%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB%E7%9A%84%E4%B8%80%E4%BA%9B%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E9%A2%98%E5%90%88%E9%9B%86/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!