动态规划:合并相邻的石头的最小代价

解法一:贪心(但不是最小花费) //不是最优解

#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

发布了98 篇原创文章 · 获赞 1 · 访问量 4496

猜你喜欢

转载自blog.csdn.net/weixin_40823740/article/details/103128614