C++算法求数字塔问题【上】—— 贪心算法

今年是虎年正月初五,我先祝大家虎年大吉,过年期间我给自己放了几天假期,现在我开始发文章了。
这次我将连发两篇文章,求数字塔问题解,用贪心算法与动态规划求解(又可以偷偷地水上两篇啦!)哎哎哎,不对,是发上两篇文章!

大家看标题就可以发现是贪心算法了,是的,本篇文章主讲贪心算法。
现在我给大家看一下贪心算法的官方讲解:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。
解题策略
1、贪心选择性质
一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
2、最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析。
(转载百度百科https://baike.baidu.com/item/%E8%B4%AA%E5%BF%83%E7%A
E%97%E6%B3%95)
接下来看题:
输入一个数字塔,返回最优解。
下面是数字塔案例:
1
1 2
1 5 7
则最优解是:
1-2-7 也就是10。
下面是代码:

#include 
#include 
using namespace std;

int main(){
	int a;		    	// 数字 
	int num;        	// 计数 
	int idx1;       	// 数组index 
	int idx2;       	// 数组内数字index 
	num = 0;
	vector<vector<int> > vec;
	int len_vec1;  		// 二维数组长度 
	cout << "请输入三角形的行数:";
	cin >> len_vec1;
	for(int i = 0; i < len_vec1; i++){
		cout << "请输入第" << i + 1 << "行的元素个数:";
		int len_vec2;   	// 数组长度
		vector<int> vec_num;
		cin >> len_vec2;
		for(int num = 0; num < len_vec2; num++){
			cin >> a;
			vec_num.push_back(a);
		}
		vec.push_back(vec_num);
	}
	for(int i = 0; i < vec.size(); ++i){
		if(i == 0){
			num = vec[0][0];
			idx1 = 1;
			idx2 = 0;
		}
		else{
			if(vec[idx1][idx2] > vec[idx1][idx2 + 1]){
				num += vec[idx1][idx2];
				idx1 += 1;
			}
			else{
				num += vec[idx1][idx2 + 1];
				idx1 += 1;
				idx2 += 1; // *
			}
		}
	}
	cout << num << endl;
}

大家尝试一下,偷偷告诉大家,贪心算法在这里有缺陷,下一篇《C++算法求数字塔问题【下】—— 动态规划》记得来看哦!

你可能感兴趣的:(c++,算法,贪心算法)