有个穷困的艺术家。他画了一幅超现实主义的作品《方块手拉手》。现在他已经把图画中手拉手的一排大小不一的方块都画出来了。现在要考虑上颜色了。可惜他手中的钱并不多了。但是他是个有追求的人,他希望这幅画中每两个相邻的方块的颜色是不一样的。你能帮他计算一下把这幅画上色后,最少需要花多少钱么。
输入:
第一行两个整数N, K,表示N个方块,K种颜色。
接下来输入N * K 的矩阵,costs[i][j] 表示第i个方块涂第j种颜色的花费。
输出:
一个整数,表示最小花费。
#include <vector>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <limits.h>
using namespace std;
int ans = INT_MAX;
bool ok(vector<int> &x, int dep)
{
if(dep > 0 && x[dep-1] == x[dep])
return false;
return true;
}
void dfs(int dep, int sum, vector<int> &x, int n, int k, vector<vector<int>>& costs)
{
if(dep >= n)
{
if(sum < ans)
ans = sum;
return;
}
for(int i=0; i<k; ++i)
{
x[dep] = i;
if(ok(x, dep))
{
dfs(dep+1, sum+costs[dep][i], x, n, k, costs);
}
x[dep] = -1;
}
}
/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
int minCost(vector<vector<int>>& costs)
{
int n = costs.size();
if(n == 0)
return 0;
int m = costs[0].size();
if(m == 0)
return 0;
vector<int> x(n, -1);
dfs(0, 0, x, n, m, costs);
return ans;
}
int main()
{
int N,K;
int cost;
vector<vector<int> > costs;
string s;
istringstream is;
getline(cin, s);
is.str(s);
is>>N>>K;
for(int i =0 ; i < N; i++)
{
vector<int> t;
getline(cin, s);
is.clear();
is.str(s);
for(int j = 0; j < K; j++) {
is >> cost;
t.push_back(cost);
}
costs.push_back(t);
}
cout<<minCost(costs)<<endl;
return 0;
}