1、2022-11-161今天,今天,你你 了吗?了吗?AC2022-11-162每周一星(每周一星(3):):混沌的云混沌的云Knight 2022-11-163第四讲第四讲动态规划动态规划(1)(1)(Dynamic programmingDynamic programming)2022-11-164先热身一下先热身一下2022-11-165(1466)计算直线的交点数计算直线的交点数问题描述:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。输入:n(n=20)输出:每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数。样例输入4样例输出0 3 4 5
2、62022-11-166初步分析初步分析:我们知道我们知道:n n条直线互不平行且无三线共点的最多条直线互不平行且无三线共点的最多交点数交点数max=1+2+max=1+2+(n-1)=n(n-1)/2,(n-1)=n(n-1)/2,但本题不这么简单,因为问题问的是:但本题不这么简单,因为问题问的是:这些直线有这些直线有多少种多少种不同的交点数?不同的交点数?2022-11-167思考思考2分钟分钟:如何解决如何解决?2022-11-168然后,然后,假设假设=n-1 0+4=0+4*0+0=00+0=0;2 2、第四条与其中两条平行,交点数为、第四条与其中两条平行,交点数为0+(n-1)0+
3、(n-1)*1+0=3;1+0=3;3 3、第四条与其中一条平行,这两条平行直线和另外两点直线的交、第四条与其中一条平行,这两条平行直线和另外两点直线的交点数为点数为(n-2)(n-2)*2=4,2=4,而另外两条直线既可能平行也可能相交,因此而另外两条直线既可能平行也可能相交,因此可能交点数为:可能交点数为:0+0+(n-2n-2)*2+0=4 2+0=4 或者或者 0+(n-2)0+(n-2)*2+1=5 2+1=5 4 4、第四条直线不与任何一条直线平行,交点数为:第四条直线不与任何一条直线平行,交点数为:0+(n-3)0+(n-3)*3+0=3 3+0=3 或或0+(n-3)0+(n-
4、3)*3+2=5 3+2=5 或或0+0+(n-3)(n-3)*3+3=63+3=6即即n=4n=4时,有时,有0 0个,个,3 3个,个,4 4个,个,5 5个,个,6 6个不同交点数。个不同交点数。重点分析重点分析n的情况:的情况:2022-11-1611从上述从上述n=4n=4的分析过程中,我们发现:的分析过程中,我们发现:m m条直线的交点方案数条直线的交点方案数=(m-rm-r)条平行线与)条平行线与r r条直线交叉的交点数条直线交叉的交点数 +r+r条直线本身的交点方案条直线本身的交点方案=(m-rm-r)*r+rr+r条之间本身的交点方案数条之间本身的交点方案数(0=rm0=r
5、109=10亿)。试想一下:试想一下:2022-11-1615 拒绝拒绝暴力,暴力,倡导倡导和谐和谐2022-11-1616从顶点出发时到底向左走还是向右走应取决于是从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。左右两道路径上的最大值求出来了才能作出决策。同样,下一层的走向又要取决于再下一层上的最同样,下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。直到倒数
6、第二层时就非常明了。如数字如数字2,只要选择它下面较大值的结点,只要选择它下面较大值的结点19前进就前进就可以了。所以实际求解时,可从底层开始,层层递进可以了。所以实际求解时,可从底层开始,层层递进,最后得到最大值。,最后得到最大值。结论:自顶向下的分析,自底向上的计算。结论:自顶向下的分析,自底向上的计算。考虑一下:考虑一下:2022-11-1617二、思考题:最长有序子序列二、思考题:最长有序子序列I012345678NumI1472583692022-11-1618解决方案:解决方案:I012345678NumI147258369FI1232343452022-11-1619三、三、11
7、60 FatMouses Speed Sample Input6008 1300 6000 2100 500 2000 1000 4000 1100 3000 6000 2000 8000 1400 6000 1200 2000 1900 Sample Output4 4 5 9 72022-11-1620题目分析:题目分析:设Micei.W表示第i只老鼠的重量,Micei.S表示第i只老鼠的速度。我们先对Mice进行排序,以W为第一关键字,从小到大,S为第二关键字,从大到小。设fi为Micei至Micen最长的序列长度。考虑某一个fi,则有:fi=max(fi,fj+1)(1=j Micej
8、.W,Micei.S Micej.S)其中,初始条件为fi=1(i=1,2,.,n)。2022-11-1621Qestion:两个问题有本质两个问题有本质区别吗?区别吗?2022-11-1622思考(期末考试题):思考(期末考试题):Super Jumping!Jumping!Juping!解题思路?解题思路?2022-11-1624四、四、1159 Common SubsequenceSample Inputabcfbc abfcabprogramming contest abcd mnp Sample Output 4 2 02022-11-1625abcfbca111111b122222
9、f122333c123334a123334b123344辅助空间变化示意图辅助空间变化示意图2022-11-1626f(i,j)=由于f(i,j)只和f(i-1,j-1),f(i-1,j)和f(i,j-1)有关,而在计算f(i,j)时,只要选择一个合适的顺序,就可以保证这三项都已经计算出来了,这样就可以计算出f(i,j).这样一直推到f(len(a),len(b)就得到所要求的解了.f(i-1,j-1)+1(ai=bj)max(f(i-1,j),f(i,j-1)(ai!=bj)子结构特征:子结构特征:2022-11-1627思考:思考:免费馅饼免费馅饼 2022-11-1628如何解决?如何解
10、决?请发表见解请发表见解 Any question?2022-11-1630理论小结理论小结2022-11-1631如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,如果我们能够保存已经解决的子问题的答案,而在需要的时候再找出已求得的答案,这样就可以避免大量的重复计算。由此而来的基本思路是,用一个表记录所有已解决的子问题的答案,不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。一、动态规划的基本思想一、动态规划的基本思想 2022-11-1632二、动态规划的基本步骤二、动态规划的基本步骤 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。
11、每一个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。设计一个动态规划算法,通常可以按以下几个步骤进行:2022-11-1633(1)找出最优解的性质,并刻画其结构特征。)找出最优解的性质,并刻画其结构特征。(2)递归地定义最优值。)递归地定义最优值。(3)以)以自底向上自底向上的方式计算出最优值。的方式计算出最优值。(4)根据计算最优值时得到的信息,构造一个最优解。)根据计算最优值时得到的信息,构造一个最优解。其中(其中(1)()(3)步是动态规划算法的基本步骤。在只)步是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(需要求出最优值的情形,步骤(4)可以省去。若
12、需要)可以省去。若需要求出问题的一个最优解,则必须执行步骤(求出问题的一个最优解,则必须执行步骤(4)。此时)。此时,在步骤(,在步骤(3)中计算最优值时,通常需记录更多的信)中计算最优值时,通常需记录更多的信息,以便在步骤(息,以便在步骤(4)中,根据所记录的信息,快速构)中,根据所记录的信息,快速构造出一个最优解。造出一个最优解。基本步骤基本步骤 2022-11-1634三、动态规划问题的特征三、动态规划问题的特征 动态规划算法的有效性依赖于问题本身所具有的两个重要性质:1、最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。2、重叠子问题:在用递归算法自顶向下
13、解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。2022-11-1635课后任务:课后任务:一、一、DIYDIY在线作业在线作业(4):(4):ACM程序设计程序设计在线作业(在线作业(4)动态规划(第一部分)动态规划(第一部分)二、常规练习(包含以上作业)二、常规练习(包含以上作业)10031003、1466 1466、10871087、11761176、20842084、11591159、1160116010581058、10691069、20592059、215121512022-11-1636下一讲:下一讲:计算几何计算几何2022-11-1637Welcome to HDOJWelcome to HDOJThank Thank You You