是有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; }