动态规划解题步骤:
1.确定状态表示:dp[i]是什么
2.确定状态转移方程:dp[i]等于什么
3.初始化:确保状态转移方程不越界
4.确定填表顺序:根据状态转移方程即可确定填表顺序
5.确定返回值
题目链接:LCR 091. 粉刷房子 - 力扣(LeetCode)
题解:
1.状态表示:f[i]表示粉刷到i号房子时,将其粉刷为红色的最少成本
g[i]表示粉刷到i号房子时,将其粉刷为蓝色的最少成本
h[i]表示粉刷到i号房子时,将其粉刷为绿色的最少成本
2.状态转移方程:f[i]=costs[i][0]+min(g[i-1],h[i-1])
g[i]=costs[i][1]+min(f[i-1],h[i-1])
h[i]=costs[i][2]+min(f[i-1],g[i-1])
3.初始化:f[0]=costs[0][0]
g[0]=costs[0][1]
h[0]=costs[0][2]
4.填表顺序:从左向右,三个表一起填
5.返回值:min(min(f[n-1],g[n-1]),h[n-1])
class Solution {
public:int minCost(vector<vector<int>>& costs) {//红蓝绿//f[i]表示粉刷到i号房子时,将其粉刷为红色的最少成本//g[i]表示粉刷到i号房子时,将其粉刷为蓝色的最少成本//h[i]表示粉刷到i号房子时,将其粉刷为绿色的最少成本//f[i]=costs[i][0]+min(g[i-1],h[i-1])//g[i]=costs[i][1]+min(f[i-1],h[i-1])//h[i]=costs[i][2]+min(f[i-1],g[i-1])size_t n=costs.size();//处理边界条件if(n==1)return min(min(costs[0][0],costs[0][1]),costs[0][2]);//创建dp表vector<int> f(n);auto g=f;auto h=f;//初始化f[0]=costs[0][0];g[0]=costs[0][1];h[0]=costs[0][2];//填表for(int i=1;i<n;++i){f[i]=costs[i][0]+min(g[i-1],h[i-1]);g[i]=costs[i][1]+min(f[i-1],h[i-1]);h[i]=costs[i][2]+min(f[i-1],g[i-1]);}//返回值return min(min(f[n-1],g[n-1]),h[n-1]);}
};