动态规划解题步骤:
1.确定状态表示:dp[i]是什么
2.确定状态转移方程:dp[i]等于什么
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]);
}
};