一、贪心算法精讲,内含例题(专栏持续更新)
1.1官方定义:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
1.2个人理解:
就是一个人想要完成一件事的时候总是一步一步来的,而贪心的人在完成这件事的每一步的时候都想要最好的(当前情况下),每一步都拿到最好的,当整件事情完成的时候,结果便是最好的。
1.3什么时候用贪心算法
但是都贪心算法不是对所有问题都能得到整体最优解,能不能使用贪心算法的关键是看当前决策会不会对后面的情况有影响,如果有那么就不能使用贪心算法(一般是用DP,后续会更新)
二、例题
接下来会用例题集中讲解贪心算法,这里是代码小白Orz,专讲你听得懂的算法!!!
2.1 股票买卖 II
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
输入格式
第一行包含整数 N,表示数组长度。
第二行包含 N 个不大于 10000 的正整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
1≤N≤105
输入样例1:
6
7 1 5 3 6 4
输出样例1:
7
样例解释
样例1:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。共得利润 4+3 = 7。
题意理解
题意大概是这样的 :一个人有两种操作(买股票、买股票),正常人都是低价卖,高价卖,如果你是王多鱼,请当我没说。 所有我们这道题思路就清晰了,当今天的价钱比明天的钱低,我们就可以今天将股票买进来,明天卖出去,当波黄牛赚个差价。
直接附代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N = 100010;
int q[N];
int n;
LL ans;
int main() {
scanf("%d",&n);
for(int i = 0; i < n; i ++) scanf("%d",&q[i]);
for(int i = 0; i< n - 1; i ++) {
if(q[i + 1] > q[i]) ans += q[i + 1] - q[i];
}
printf("%lld\n",ans);
return 0;
}
这里是代码小白Orz,专讲你听得懂的代码!!