给房子涂色

是有n户人家的房子排成一排,打算把他们的房子图上颜色,有red、green、blue三种颜色,每家人涂不同的颜色要花不同的费用,而且相邻两户人家之间的颜色要不同,求最小的总花费费用。

输入格式:

第一行输入n

接下来n行输入每种房子涂red green blue 颜色的价格 cost1 cost2 cost3

输出样例:

4

13 23 12

77 36 64

44 89 76

31 78 45

输出样例:

137

输入样例:

3

26 40 83

49 60 57

13 89 99

输出样例:

96

输出最小花费

#include<iostream>
#include<string.h>
#include<math.h>

using namespace std;
int n,m,v; 
int ans;
int mod=1e9+7;
int dp[105][105],cost[105][3];
bool vis[105]; 

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>cost[i][0]>>cost[i][1]>>cost[i][2];
    }
    dp[0][0]=dp[0][1]=dp[0][2]=0;                        //初始状态
    for(int i=1;i<=n;i++){
        for(int j=0;j<3;j++){                                            //j 表示此时选第 j 种颜色 
            dp[i][j]=99999999;                                            
            for(int k=0;k<3;k++){                                        //k 表示上一个选 k 的颜色 用来排除选相同的颜色 
                if(j==k){
                    continue;
                }
                dp[i][j]=min(dp[i-1][k]+cost[i-1][j],dp[i][j]); //因为 i要比较i-1的价格 则从 1 开始,dp[i-1][k]表示选上一个房子选k的价格 
            }                                                    //而cost从0开始,cost[i-1][j]表示选此时的房子时的价格 
        }
    }
    ans=min(min(dp[n][0],dp[n][1]),dp[n][2]);                  //从最后一个房子选不同颜色时的最小值 
    cout<<ans;
    return 0;
}
原文地址:https://www.cnblogs.com/xusi/p/12493015.html