1. 题目描述
难度:简单
2. 题目分析
这道题目是一道典型的动态规划问题,如果我们只把目光放在一个最少花费的身上,状态转化方程并不容易想出来,但是如果我们着眼于每一个颜色的最少花费,那么状态转化方程可以很容易地写成:
- 初始态
- 过程
- 结果:
时间复杂度为O(n).
3. C语言实现
代码如下:
int Min(int a, int b){
return a<b?a:b;
}
int minCost(int** costs, int costsSize, int* costsColSize){
int n = costsSize;
if(n == 0) return 0;
int res;
// 申请三个内存空间用来存放每个颜色的最小花费
int* red = (int *)malloc(sizeof(int)*n);
int* blue = (int *)malloc(sizeof(int)*n);
int* green = (int *)malloc(sizeof(int)*n);
// 初始化
red[0] = costs[0][0];
blue[0] = costs[0][1];
green[0] = costs[0][2];
for(int i = 1; i < n; i++){
red[i] = Min(blue[i-1], green[i-1]) + costs[i][0];
blue[i] = Min(red[i-1], green[i-1]) + costs[i][1];
green[i] = Min(red[i-1], blue[i-1]) + costs[i][2];
}
res = Min(Min(red[n-1], blue[n-1]), green[n-1]);
// 释放数组内存空间
free(red);
free(green);
free(blue);
return res;
}