贪心算法
与
动态规划
贪心算法
( Greedy Algorithm )
贪心法的基本思路:
——从问题的某一个初始解出发逐步逼近给定的
目标,以尽可能快的地求得更好的解。当达到某
算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
贪心算法的基本步骤
1 、从问题的某个初始解出发。
2 、采用循环语句,当可以向求解目标前
进一步时,就根据局部最优策略,得到一
个部分解,缩小问题的范围或规模。
3 、将所有部分解综合起来,得到问题的
最终解。
活动安排问题
活动安排问题就是要在所给的活动集合中选出
最大的相容活动子集合。贪心算法使得尽可能
多的活动能兼容地使用公共资源
设待安排的 11 个活动的开始时间和结束时间
按结束时间的非减序排列如下:
1413121110987654f[i]
122886535031S[i]
1110987654321i
若被检查的活动 i 的开始时间 Si 小于最近
选择的活动 j 的结束时间 fi ,则不选择活动
i ,否则选择活动 i 加入集合 A 中。
可以证明,如果在可能的事件 a1
=f[j]) {
a[i]=true;
j=i;
count++;
}
else a[i]=false;
}
return count;
}
FOJ 1111 Radar Installation
•给出雷达的扫描半径 R与孤岛的个数 N与坐标,
•求最小要用几个这样的雷达。
枚举每一个孤岛
求出其与 X 轴的交点
dx = sqrt(r * r - y * y);
x_min = x - dx;
x_max = x + dx;
Nlog(n) 排序
判断其它点也 X 轴的交点是否在
[x_min,x_max] 范围内 , 或包含
相关题目
1574 一食堂宣传栏
1230 区间相交问题
FOJ 1106 Sum of Factorials
问一个数能否由相应的阶乖的和组合而成
列表
{1,1,2,6,24,120,720,5040,40320,362880};
将 N 尝试性的减去表中的数,为零则
YES ,否则为 NO
证明?
FOJ 1085 Work Reduction
给出初始时的工作量 n ,结束时剩下的工
作量 m ,给出可以完成这些工作量的公司
,这些公司的收费方式有两种, A 一种是
减少一个单位的的工作量,每减少一单位
工作量花费 a , B 一种是减少一半单位的
工作量,总的花费为 b ,问,分别由这些
公司完成的最小的费用。
当前工作量 cur_n 的一半小于 m 时,只能
用 A 方法
否则
(Cur_n-cur_n/2)*a > b 时,选择 B 方法
选择 A 方法
如此循环
N <= 100000
如此 log(N) 的复杂度很好的避免了用其它方法
可能出现的 TLE
1150Peter's smokes
皮特有 n 根烟 , 有一个兑换数 k.皮特每抽
一根烟都把烟头留着 ,直到足够 k 个烟头时
, 就可以换一根新烟抽 . 要编写一个程序 ,
输入 n,k, 算出皮特最多能抽多少烟 .
sum = n;
while (n / k)
{
sum += n / k;
n = n / k + n % k;
}
1672Minimum Adjacent Value
• The minimum adjacent value is the minimum
absolute value |a - b| of the two different
elements a and b in the array.
If the N elements are all the same, just
output the absolute value of the element.
Nlog(N) 排序
求相邻的两个数的差的绝对值 ,
O(N) 扫描求出最小值
It is guaranteed that the element in the
array will fit within a 32-bit signed integer.
|a-b| 超过 32 位整型
64 位整型 Long long
若要用贪心算法求解某问题的整体最优解
,必须首先证明贪心思想在该问题的应用
结果就是最优解!!
1316Tian Ji -- The Horse Racing
1541Exploration
1505Minimum value
动态规划
( Dynamic Programming )
• 动态规划算法的基本要素
• ( 1 )最优子结构性质
• ( 2 )重叠子问题性质
• 掌握设计动态规划算法的步骤。
• (1)找出最优解的性质,并刻划其结构特征。
• (2)递归地定义最优值。(写出动态规划方程);
• (3) 以自底向上的方式计算出最优值。
• (4) 根据计算最优值时得到的信息,构造最优解。
FOJ1004 Number Triangle
求人从顶端到底部 , 每次只能向左下右下走 , 最
多能取得的值 .
数据规模 : 行数 1<=R<=1000
数塔中数
值 0..100
如图最优解为 [ 7-3-8-7-5 ]=30
状态表示
用 a[i][j] 表示第 i 行第
j 列的值。
用 F(i,j) 表示第 i 行第 j
列走到底部所能取得的最大值。
而 F(1,1) 就是题目所求的
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
。
搜索源代码
#include
const int M=1000+5;
int a[M][M],n;
inline int max(int x,int y){ return x
const int M=1000+5;
int f[M][M],a[M][M];
inline int max(int x,int y){ return x=1;i--)
for(j=1;j<=i;j++)
f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]);
printf("%d\n",f[1][1]);
}
return 0;
}
FOJ1320 Ones
给一个整数 n ,要你找一个值为 n 的表达
式,这个表达式只有 1 + * ( ) 够成。并且 1
不能连续,比如 11+1 就不合法。
输入 n,(1<=n<=10000)
输出最少需要多少个 1才能构成表达式。
样例: n=2=1+1 ans=2
n=10=(1+1)*(1+1+1+1+1) ans=7
Ones
让 f[i] 表示最少数量的 1 能够表示 i 。
add: f[i]=f[j]+f[i-j] 0
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
每次只能选取相
邻的两堆合并成新的一堆,并将新的一堆
的石子数,记为该次合并的得分。求最少
的得分。
例如: 3堆石子 2 5 1
合并
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
一 : [2 5 1]->[7 1]->[8] 分数 7+8=15
合并方案二 : [2 5 1]->[2 6]->[8] 分数 6+8=14
FOJ1319 Blocks of Stones
状态表示:
用 a[i] 表示初始时每堆石子的个数。
用 s[i] 表示初始时从第 1堆到第 i堆石子的总
和。
用 f[i][j](i<=j) 表示从第 i堆合并到第 j堆的最
小分数。 f[i][j]=min{f[i,k-1]+f[k,j]}+w[i,j];
w[i][j]=sum{a[i]…a[j]}=s[j]-s[i-1];
这样枚举是 n^3 的。
最长公共子序列问题 LCS
最长公共子序列问题也有最优子结构性质,因为我们有如
下定理:
定理 : LCS 的最优子结构性质
设序列 X= 和 Y= 的一个
最长公共子序列 Z= ,则:
若 xm=yn ,则 zk=xm=yn且 Zk-1 是 Xm-1 和 Yn-1 的最
长公共子序列;
若 xm≠yn且 zk≠xm ,则 Z 是 Xm-1 和 Y 的最长公共子序
列;
若 xm≠yn且 zk≠yn ,则 Z 是 X 和 Yn-1 的最长公共子序
列。
其中 Xm-1= , Yn-1= , Zk-1= 。
由最长公共子序列问题的最优子结构性质可知,要找出
X= 和 Y= 的最长公共子
序列,可按以下方式递归地进行:
当 xm=yn 时,找出 Xm-1 和 Yn-1 的最长公共子序列,
然后在其尾部加上 xm(=yn) 即可得 X 和 Y 的一个最长公
共子序列。
当 xm≠yn 时,必须解两个子问题,
即找出 Xm-1 和 Y 的一个最长公共子序列及
X 和 Yn-1 的一个最长公共子序列。
这两个公共子序列中较长者即为 X 和 Y 的一个最长公共
子序列。
我们来建立子问题的最优值的递归关系。
用 c[i,j]记录序列 Xi 和 Yj 的最长公共子序
列的长度。其中 Xi= , Yj= 。当 i=0 或 j=0 时
,空序列是 Xi 和 Yj 的最长公共子序列,故
c[i,j]=0 。其他情况下,
1160Common Subsequence
1502Letter Deletion
FOJ1147 Tiling
In how many ways can you tile a 2 x n
rectangle by 2 x 1 or 2 x 2 tiles?
Here is a sample tiling of a 2 x 17
rectangle.
Input is a sequence of lines, each line
containing an integer number 0 <= n <=
250. For each line of input, output one
integer number in a separate line giving
the number of possible tilings of a 2xn
rectangle.
状态表示: F[n] 表示 2 x n 的走道上铺满 1 x
2 , 2 x 2 的砖块的方法数量
考虑最后一块砖和最后两块砖的放法,很容
易写出 DP状态转移方程。
F[i]=F[i-1]+F[i-2]+F[i-2], 边界: F[0]=F[1]=1;
最后一块 1 x 2竖放 :F[i-1]
最后两块 1 x 2横放 :F[i-2]
最后放一块 2 x 2 的 :F[i-2]
另外: n <= 250 ,需要高精度
1018Maximal Sum
1130Bridging Signals
1340Longest Ordered Subsequence
1392Linear Board Game
1432Coin Changing
1559Count Zeros
1506堆箱子
Thank you
Slide 1
Slide 2
Slide 3
Slide 4
Slide 5
Slide 6
Slide 7
Slide 8
Slide 9
Slide 10
Slide 11
Slide 12
Slide 13
Slide 14
Slide 15
Slide 16
Slide 17
Slide 18
Slide 19
Slide 20
Slide 21
Slide 22
Slide 23
Slide 24
Slide 25
Slide 26
Slide 27
Slide 28
Slide 29
Slide 30
Slide 31
Slide 32
Slide 33
Slide 34
Slide 35
Slide 36
Slide 37
Slide 38
Slide 39
Slide 40
Slide 41
Slide 42