解法一:贪心(但不是最小花费) //不是最优解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class node
{
public:
node(int i, int v) :i(i), v(v) {};
int i,v;
};
bool cmp(node s1, node s2)
{
return s1.i < s2.i;
}
int tanxin(vector<node> s)
{
int sum = 0;
int n = s.size() - 1;
for (int j = 0; j < n; j++)
{
sort(s.begin(), s.end(), cmp);
int min = INT_MAX, small1 = 0, small2 = 0;
for (int i = 0; i < s.size() - 1; i++)
if (abs(s[i].i - s[i + 1].i) == 1 && min > (s[i].v + s[i + 1].v))
{
min = s[i].v + s[i + 1].v;
small1 = i;
small2 = i + 1;
}
sum += min;
s[small1].v = min;
swap(s[small2].v, s[s.size() - 1].v);
s.pop_back();
}
return sum;
}
void main()
{
int a[7] = { 5,3,2,1,6,8,7 };
vector<node>s;
for (int i = 0; i < 7; i++)
{
node b(i, a[i]);
s.push_back(b);
}
cout<<tanxin(s);
system("pause");
}
解法二:递归
int find_min(int i,int j,vector<node> s)
{
if (i == j)
return 0;
int min = INT_MAX, t;
int sum = 0;
for (int k = i; k <= j; k++)
sum += s[k].v;
for (int k = i; k <j; k++)
{
t = find_min(i, k, s) + find_min(k + 1, j, s);
if (min > t)
min = t;
}
return min+sum;
}
#define max 100
int b[max][max];
int mfind_path(int i, int j, vector<node>s)
{
if (b[i][j] != -1)
return b[i][j];
if (i == j)
{
b[i][j] = 0;
return 0;
}
int sum = 0,min=INT_MAX,t;
for (int k = i; k <= j; k++)
sum += s[k].v;
for (int k = i; k < j; k++)
{
t = mfind_path(i, k, s) + mfind_path(k + 1, j, s);
if (min > t)
min = t;
}
b[i][j] = min+sum;
return b[i][j];
}
https://blog.csdn.net/only06/article/details/60469855