动态规划14:LCR 091. 粉刷房子

动态规划解题步骤:

1.确定状态表示:dp[i]是什么

2.确定状态转移方程:dp[i]等于什么

3.初始化:确保状态转移方程不越界

4.确定填表顺序:根据状态转移方程即可确定填表顺序

5.确定返回值

题目链接:LCR 091. 粉刷房子 - 力扣(LeetCode)

动态规划14:LCR 091. 粉刷房子_第1张图片

题解:

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>& 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 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

你可能感兴趣的:(#,动态规划,动态规划,算法)