USACO上面的动态规划题目
背包问题 usaco
背包问题译 by 铭(在中国,背包问题一般是这样描述的:设n个重量为(W1,W2,...Wn)的物品和一个载重为S的背包,将物品的一部分xi放进背包中的利润是Pixi,问如何选择物品的种类和数量,使得背包装满而获得最大的利润?另有一简化版本说:设有一个背包可以放入的物品重量为S,现有n件物品,重量分别为W1,W2,...Wn。
问能否从这n件物品中选择若干件放入此背包,使得放入的重量之和正好为S。
--译者加,不知道有没有班门弄斧之嫌)前提●贪心法(它是一种多步决策法,它总是作出在当前看来是最好的选择,它的考虑不是从整体出发,而只是某种意义上的局部最优,这样贪心法不能对所有问题达到整体最优解,但是对相当范围的许多问题都能够产生整体最优解。
--译者)●动态规划(它是将问题进行逐步的划分来缩小问题的规模,直到可以求出子问题的解为止。
分划子问题后,对应的子问题中含有大量的重复,这样就将重复地求解;在第一次遇到重复时把它解决,并将解保存起来,以备后面引用。
动态规划法常用来求一个问题在某种意义下的最优解。
--译者)●递归下降示例问题:用录音带录音农场主约翰最喜欢的爱好是制作一个Bessie喜欢的音乐合集磁带以便它在产奶时听。
Bessie的产奶量取决于它产奶时所听的歌曲。
已知一组歌曲(每首歌都由一对整数--此曲的长度(以秒计),听该首歌时的产奶量来表示)以及给挤奶的总时间。
找到这样一组歌曲的集合,使得歌曲的总长度不超过给Bessie挤奶的总时间且使Bessie的产奶量达到最大。
抽象描述已知一组物品--每个都有其尺寸和值(比如,重量),以及可用的总空间。
找到这样一个集合,使得该集合的值的和最大,且其尺寸的和受某些限制所约束。
集合中任何一个特定的项目的总数目/尺寸不能超过它的可利用率。
解题想法视其为背包问题的一般方法是一个容量受限的背包使得放入其中的物品的值达到最大。
以上述问题为例,Bessie产奶时听的音乐带就是“背包”,而那些歌就是“放入背包中的物品”。
USACO DP动规 完整版
Wizard1.单调队列优化①土地并购(Land Acquisition,2008Mar)②干草塔(Tower of Hay,2009Open)③又买饲料(Buying Feed,2010Nov)④玉米实验(Cornfields,2003Mar)⑤修剪草坪(Mowing the Lawn,2011Open)2.树型①焊接(Soldering,2011Open)②产奶比赛(Milk Team Select,2006Mar)③道路重建(Rebuilding Roads,Feb2002)④手机网络(Cell Phone Network,2008Jan)3.背包问题续①电子游戏(Video Game Troubles,2009Dec)②最少找零(The Fewest Coins,2006Dec)③三个代表(Jersey Politics,2005Feb)④录制唱片(Raucous Rockers,1996Qualifying Round)4.背包问题①股票市场(Stock Market,2009Feb)②奶牛会展(Cow Exhibition,2003Fall)③太空电梯(Space Elevator,2005Mar)④平分子集(Subset Sums,1998Spring)5.区间型①提交作业(Turning in Homework,2004Open)②抢鲜草(Grazing on the Run,2005Nov)③最优回文(Cheapest Palindrome,2007Open)④智取金币(Treasure Chest,2010Dec)6.其他一①打扫食槽(Cleaning Up,2009Mar)②奶牛自行车队(Cow Cycling,Feb2002)③滑雪缆车(Ski Lift,2006Mar)④奶牛飞盘队(Cow Frisbee Team,2009Mar)7.其他二①滑雪比赛(Bobsledding,2009Dec)②滑雪课程(Ski Lessons,2009Open)③方形牛棚(Big Barn,1997Fall)④接住苹果(Apple Catching,2004Nov)⑤公司利润(Profits,2011Jan)土地并购(Land Acquisition,2008Mar)首先我们按长与宽都递减の排序,如果有一个矩形长宽都不如另一个矩形,那么可以忽略它。
usaco 比赛 数论 相关题目
在USACO比赛中,数论相关题目一直是考察的热点之一。
数论作为数学的一个重要分支,涉及整数的性质和关系,常常能够运用到算法设计和问题求解中。
本文将从简单到复杂,由浅入深地探讨USACO比赛中的数论相关题目,帮助你更深入地理解这一主题。
1. 简单级别:在USACO比赛的入门级题目中,通常会涉及一些基本的数论知识,比如素数、最大公约数、最小公倍数等。
给定两个整数,要求求它们的最大公约数或最小公倍数;或者判断一个数是否为素数等。
这些题目往往需要运用到基本的数论算法,比如欧几里得算法求最大公约数、筛法求素数等。
2. 中等级别:在中等级别的USACO比赛题目中,数论相关的内容会更加复杂和深刻。
可能涉及到模运算、同余方程、欧拉函数、费马小定理等知识点。
题目可能会要求实现一些高级的数论算法,比如快速幂算法、扩展欧几里得算法等。
这些题目往往需要更深入的数论知识和算法功底,能够更好地理解和运用复杂的数论知识。
3. 高级级别:在USACO比赛的高级题目中,数论相关的内容往往会与其他算法知识结合,考察的角度也更加灵活多样。
题目可能会涉及到数论与图论、动态规划、贪心算法等内容的结合,难度较大。
此时,除了对数论知识的深刻理解外,还需要具备较强的问题建模能力和算法设计能力。
总结回顾:通过以上的分析,我们可以看到,USACO比赛中的数论相关题目,涵盖了不同难度级别的内容,从简单的基本算法到复杂的高级问题解决方案,都需要对数论知识有较为全面、深刻的理解。
在备战USACO比赛时,我们要加强对数论知识的学习和掌握,尤其要注重基础知识的打牢和算法能力的提升。
个人观点和理解:我个人认为,数论是一门非常有趣和有挑战性的数学分支,在USACO 比赛中能够有机会运用数论知识解决实际问题,对于提高自己的数学建模能力和算法设计能力都是非常有益的。
我会在备战USACO比赛的过程中,加强对数论相关知识的学习和实践,努力提高自己的数论解题能力。
通过以上分析和讨论,我们对USACO比赛中的数论相关题目有了更全面、深刻的理解。
USACO题解(NOCOW整理版)
USACO 题解Chapter1Section 1.1Your Ride Is Here (ride)这大概是一个容易的问题,一个“ad hoc”问题,不需要特殊的算法和技巧。
Greedy Gift Givers (gift1)这道题的难度相当于联赛第一题。
用数组incom、outcom记录每个人的收入和支出,记录每个人的名字,对于送礼人i,找到他要送给的人j,inc(incom[j],outcom[i] div n),其中n 是要送的人数,最后inc(incom[i],outcom[i] mod n),最后输出incom[i]-outcom[i]即可。
(复杂度O(n^3))。
用Hash表可以进行优化,降复杂度为O(n^2)。
Friday the Thirteenth (friday)按月为单位计算,模拟运算,1900年1月13日是星期六(代号1),下个月的13日就是代号(1+31-1) mod 7+1的星期。
因为数据小,所以不会超时。
当数据比较大时,可以以年为单位计算,每年为365天,mod 7的余数是1,就是说每过一年所有的日和星期错一天,闰年第1、2月错1天,3月以后错2天。
这样,只要先求出第一年的解,错位添加到以后的年即可。
详细分析:因为1900.1.1是星期一,所以1900.1.13就等于(13-1) mod7+1=星期六。
这样讲可能不太清楚。
那么,我来解释一下:每过7天是一个星期。
n天后是星期几怎么算呢?现在假设n是7的倍数,如果n为14,那么刚好就过了两个星期,所以14天后仍然是星期一。
但如果是过了15天,那么推算就得到是星期二。
这样,我们就可以推导出一个公式来计算。
(n天mod 7(一个星期的天数)+ 现在日期的代号) mod 7 就等于现在日期的代号。
当括号内的值为7的倍数时,其代号就为0,那么,此时就应该是星期日这样,我们可以得出题目的算法:int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}int b[8]={0}a数组保存一年12个月的天数(因为C语言中数组起始下标为0,所以这里定义为13)。
动态规划47题
动态规划练习【题目一览】总分【问题描述】学生在我们USACO的竞赛中的得分越多我们越高兴。
我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。
我们可以从几个种类中选取竞赛的题目,这里的一个“种类”是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。
你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。
输入包括竞赛的时间M(1<=M<=10000)(不要担心,你要到了训练营中才会有长时间的比赛)和“种类”的数目N(1<=N<=10000)。
后面的每一行将包括两个整数来描述一个“种类”:第一个整数说明解决这种题目能得的分数(1<=points<=10000),第二整数说明解决这种题目所需的时间(1<=minutes<=10000)。
你的程序应该确定我们应该从每个“种类”中选多少道题目使得能在竞赛的时间中得到最大的分数。
来自任意的“种类”的题目数目可能任何非负数(0或更多)。
计算可能得到的最大分数。
【输入格式】输入文件中的第1行:M,N--竞赛的时间和题目“种类”的数目。
第2~N+1行:两个整数:每个“种类”题目的分数和耗时。
【输出格式】输出文件中仅一行,包括那个在给定的限制里可能得到的最大的分数。
【输入输出样例】输入:300 4100 60250 120120 10035 20输出:605从第2个“种类”中选两题第4个“种类”中选三题。
邮票【问题描述】已知一个N枚邮票的面值集合(如,{1分,3分})和一个上限K——表示信封上能够贴K张邮票。
计算从1到M的最大连续可贴出的邮资。
例如,假设有1分和3分的邮票;你最多可以贴5张邮票。
很容易贴出1到5分的邮资(用1分邮票贴就行了),接下来的邮资也不难:6 = 3 + 37 = 3 + 3 + 18 = 3 + 3 + 1 + 19 = 3 + 3 + 310 = 3 + 3 + 3 + 111 = 3 + 3 + 3 + 1 + 112 = 3 + 3 + 3 + 313 = 3 + 3 + 3 + 3 + 1然而,使用5枚1分或者3分的邮票根本不可能贴出14分的邮资。
USACO试题精选(第一辑)
USACO试题精选第一辑第1题利润(Profits, USACO 2011 Jan) (3)第2题购买饲料二(Buying Feed II, USACO 2010 Jan) (4)第3题奶牛杂技(Cow Acrobats, USACO 2006 Nov) (5)第4题抓苹果(Apple Catching, USACO 2004 Nov) (6)第5题抢购干草(Hay For Sale, USACO 2008 Dec) (7)第6题建造栅栏(Building A Fence, USACO 2008 Oct) (8)第7题建造道路(Building Roads, USACO 2007 Dec) (9)第8题青铜莲花池(Bronze Lilypad Pond, USACO 2007 Feb) (10)第9题滑雪课程(Ski Lessons, USACO 2009 Open) (11)第10题奶牛飞盘队(Cow Frisbee Team, USACO 2009 Mar) (12)第11题奶牛博览会(Cow Exhibition, USACO 2003 Fall) (13)第12题最近回文(Cheapest Palindrome, USACO 2007 Open) (14)第13题安慰奶牛(Cheering up the Cows, USACO 2008 Nov) (15)第14题玉米迷宫(Corn Maze, USACO 2011 Open) (16)第15题奶牛集会(MooFest, USACO 2004 Open) (17)第16题奶牛文字(Cowlphabet, USACO 2011 Feb) (18)第17题奶牛跨栏(Cow Hurdles, USACO 2007 Nov) (19)第18题工作安排(Work Scheduling, USACO 2009 Open) (20)第19题手机网络(Cell Phone Network, USACO 2008 Jan) (21)第20题提交作业(Turning in Homework, USACO 2004 Open) (22)第21题滑雪缆车(Ski Lift, USACO 2006 Mar) (23)第22题派发巧克力(Chocolate Giving, USACO 2010 Feb) (24)第23题赞助学费(Financial Aid, USACO 2004 Mar) (25)第24题白银莲花池(Silver Lilypad Pond, USACO 2007 Feb) (26)第25题地震(Earthquake, USACO 2001 Open) (27)第26题股票市场(Stock Market, USACO 2009 Feb) (28)第27题奶牛赛车(Cow Cycling, USACO Feb 2002) (29)第28题奶牛观光(Sightseeing Cows, USACO 2007 Dec) (30)第29题道路重建(Rebuilding Roads, USACO Feb 2002) (31)第30题奶牛接力(Cow Relays, USACO 2007 Nov) (32)第31题猜数游戏(Haybale Guessing, USACO 2008 Jan) (33)第32题混乱奶牛(Mixed Up Cows, USACO 2008 Nov) (34)第33题修剪草坪(Mowing the Lawn, USACO 2011 Open) (35)第34题道路翻新(Revamping Trails, USACO 2009 Feb) (36)第35题安排牧场(Corn Fields, USACO 2006 Nov) (37)第36题叠积木(Cube Stacking, USACO 2004 Open) (38)第37题奶牛抗议(Generic Cow Protests, USACO 2011 Feb) (39)第38题洞穴奶牛第一话(Cave Cow 1, USACO 2004 Open) (40)第39题打扫食槽(Cleaning Up, USACO 2009 Mar) (41)第40题购买饲料(Buying Feed, USACO 2010 Nov) (42)第41题土地并购(Land Acquisition, USACO 2008 Mar) (43)第42题干草塔(Tower of Hay, USACO 2009 Open) (44)第43题明星奶牛(Popular Cows, USACO 2003 Fall) (45)第44题电子游戏(Video Game Troubles, USACO 2009 Dec) (46)第45题产奶比赛(Milk Team Select, USACO 2006 Mar) (47)第46题黄金莲花池(Lilypad Pond, USACO 2007 Feb) (48)第47题逢低吸纳(BUY LOW, BUY LOWER, USACO Feb 2002) (49)第48题焊接(Soldering, USACO 2011 Open) (50)第49题旅馆(Hotel, USACO 2008 Feb) (51)第50题道路和航线(Roads and Planes, USACO 2011 Jan) (52)这一辑从USACO月赛中选择了质量很高的50题,是用来训练算法设计和实现的极好素材,如果初学者希望掌握比较扎实的基本功,我建议将这一辑的题目好好研究一下。
usaco题目集
usaco题目集usaco题目集是一系列来自美国计算机奥林匹克竞赛(USACO)的编程题目。
USACO是一项面向中学生的计算机竞赛,旨在培养学生的计算机科学和算法设计能力。
该竞赛涵盖了广泛的主题,包括数据结构、图论、动态规划和搜索等。
usaco题目集的难度分为四个级别:铜牌、银牌、金牌和白金。
每个级别的题目都有一定的难度和要求。
通过完成这些题目,学生们可以提高他们的编程技巧和解决问题的能力。
usaco题目集的题目非常有趣和有挑战性。
每个题目都描述了一个具体的问题,学生需要设计和实现一个程序来解决这个问题。
这些问题有时与现实生活中的情境相关,有时与抽象的数学和逻辑问题相关。
例如,一个题目可能要求学生计算某个数列的前n项之和,另一个题目可能要求学生确定给定图形的面积。
解决这些问题需要学生们运用他们所学的算法和数据结构知识,并且具备良好的编程技巧。
usaco题目集的特点之一是其严格的评判标准。
每个题目都有一组测试数据,用于验证学生程序的正确性和效率。
程序需要在规定的时间内给出正确的输出结果,否则将被判定为错误。
这种评判标准旨在培养学生们高效率和准确性的编程能力。
通过解决usaco题目集中的问题,学生们可以提高他们的计算机科学能力,并为将来的学习和工作做好准备。
这些问题不仅可以让学生们巩固他们所学的知识,还可以培养他们的创造力和解决问题的能力。
此外,usaco题目集还提供了一个平台,让学生们可以与全美范围内的同龄人交流和竞争。
每年,usaco组织全美性的比赛,邀请来自各州的优秀选手进行角逐。
这些比赛不仅考察学生的编程能力,还促进了学生们之间的交流和合作。
总之,usaco题目集是一个很好的学习和提高编程能力的资源。
通过解决这些问题,学生们可以提高他们的计算机科学和算法设计能力,并为将来的学习和工作做好准备。
这些问题的多样性和挑战性,使得usaco题目集成为中学生们学习编程的重要工具。
USACO 2024年1月黄金组试题
USACO 2024J ANUARY C ONTEST ,G OLD P ROBLEM 1.W ALKINGINM ANHATTANFarmer John 和他的Q(1≤Q≤2×105)头奶牛在曼哈顿度假,但奶牛们逃跑了,现在正在城市里自由走动!曼哈顿很大——大到它的N(1≤N≤2×105)条道路在x-y 平面上无限延伸,但简单的是,这些道路都完全水平或垂直。
每条水平和垂直道路都可以用形式为y=c i 或x=c i 的方程表示,其中c i 是0到109范围内的整数。
Farmer John 准确地知道每头奶牛从哪里开始行走,以及她们多久之前逃跑的。
奶牛们很容易被预测,因此每头奶牛都是按照以下模式行走:她们只会以每秒一个单位的速度向北(+y)或向东(+x)行走。
如果她们当前在一条道路上,她们会继续沿着道路的方向行走。
如果她们在两条道路的交叉口处,如果她们行走了偶数秒,则向北行走,否则向东行走。
给定曼哈顿的布局以及每头奶牛的信息,帮助Farmer John 求出他的奶牛们现在在哪里!输入格式:输入的第一行包含N 和Q。
以下N 行描述道路。
每条道路由方向(H 或V)和坐标c i 表示。
输入保证道路各不相同。
以下Q 行描述奶牛。
每头奶牛由三个整数(x i ,y i ,d i )表示,意味着她们在d i 秒前从(x i ,y i )开始行走。
输入保证(x i ,y i )位于某条道路上,且0≤x i ,y i ,d i ≤109。
输出格式:输出Q 行,其中第i 行包含第i 头奶牛当前的位置。
输入样例:45V 7H 4H 5V 66310641065106610100410输出样例:7136156161104前两头奶牛经过的路径如下:(6,3)->(6,4)->(7,4)->(7,5)->(8,5)->...->(14,5)(6,4)->(6,5)->(7,5)->(7,6)->...->(7,13)测试点性质:∙测试点2-4:N,Q,c i ,x i ,y i ,d i ≤100。
usaco2023 12月银组题解
【usaco2023 12月银组题解】一、题目概况1.1 题目背景12月份的usaco银级比赛是每年一度的重要赛事,题目难度适中,涵盖了很多经典算法和数据结构的应用。
1.2 题目数量本次比赛共包含5道题目,涉及动态规划、贪心算法、图论等多个领域。
二、题目详解2.1 第一题 - 最小差值本题要求给定一个包含n个正整数的数组,求该数组中两个元素的最小差值。
2.1.1 解题思路我们可以先对数组进行排序,然后遍历数组中相邻的两个元素,计算它们之间的差值,并更新最小差值。
2.1.2 代码实现```c++int minDiff(vector<int> nums) {sort(nums.begin(), nums.end());int minDiff = INT_MAX;for (int i = 1; i < nums.size(); i++) {minDiff = min(minDiff, nums[i] - nums[i-1]);}return minDiff;}```2.2 第二题 - 运动员配对本题要求给定一个包含n个正整数的数组,表示n个运动员的实力值,要求找出一种最优的配对方案,使得每对运动员的实力差值最小。
2.2.1 解题思路我们可以先对数组进行排序,然后使用双指针法找出实力差值最小的配对方案。
2.2.2 代码实现```c++int minP本人ring(vector<int> strength) {sort(strength.begin(), strength.end());int minDiff = INT_MAX;int l = 0, r = strength.size()-1;while (l < r) {minDiff = min(minDiff, strength[r] - strength[l]);l++;r--;}return minDiff;}```2.3 第三题 - 最小生成树本题给定一个无向连通图,要求求出该图的最小生成树的权值之和。
USACO题解(NOCOW整理版)
U S A C O题解(N O C O W整理版)-CAL-FENGHAI.-(YICAI)-Company One1USACO 题解Chapter1Section 1.1Your Ride Is Here (ride)这大概是一个容易的问题,一个“ad hoc”问题,不需要特殊的算法和技巧。
Greedy Gift Givers (gift1)这道题的难度相当于联赛第一题。
用数组incom、outcom记录每个人的收入和支出,记录每个人的名字,对于送礼人i,找到他要送给的人j,inc(incom[j],outcom[i] div n),其中n是要送的人数,最后inc(incom[i],outcom[i] mod n),最后输出incom[i]-outcom[i]即可。
(复杂度O(n^3))。
用Hash表可以进行优化,降复杂度为O(n^2)。
Friday the Thirteenth (friday)按月为单位计算,模拟运算,1900年1月13日是星期六(代号1),下个月的13日就是代号(1+31-1) mod 7+1的星期。
因为数据小,所以不会超时。
当数据比较大时,可以以年为单位计算,每年为365天,mod 7的余数是1,就是说每过一年所有的日和星期错一天,闰年第1、2月错1天,3月以后错2天。
这样,只要先求出第一年的解,错位添加到以后的年即可。
详细分析:因为1900.1.1是星期一,所以1900.1.13就等于(13-1) mod7+1=星期六。
这样讲可能不太清楚。
那么,我来解释一下:每过7天是一个星期。
n 天后是星期几怎么算呢?现在假设n是7的倍数,如果n为14,那么刚好就过了两个星期,所以14天后仍然是星期一。
但如果是过了15天,那么推算就得到是星期二。
这样,我们就可以推导出一个公式来计算。
(n天 mod 7(一个星期的天数)+ 现在日期的代号) mod 7 就等于现在日期的代号。
当括号内的值为7的倍数时,其代号就为0,那么,此时就应该是星期日这样,我们可以得出题目的算法:int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}int b[8]={0}a数组保存一年12个月的天数(因为C语言中数组起始下标为0,所以这里定义为13)。
22年美赛C题动态规划
22年美赛C题动态规划背景:能源生产和使用是任何经济的重要组成部分。
在美国,能源政策的许多方面都分散下放到州的水平。
此外,不同州的地理区域和工业影响能源的使用和生产。
在1970年,12个在美国西方的州形成西部州际能源协议(WIEC),其任务重点是促进这些州之间的合作,促进发展和核能技术管理。
州际契约是一种在两个或多个州之间的契约安排。
在这些州就具体的政策问题达成一致意见,就某一特定的区域或州事项采取一套标准或相互合作。
问题:在美国与墨西哥的边境,有四个州—美国加利福尼亚州(CA),亚利桑那州(AZ),美国新墨西哥州(NM)和得克萨斯州(TX),这是希望到形成一个关注增加使用清洁、可再生能源的来源的实际的新能源契约。
你的团队需要帮助这四个州的州长对这些数据进行分析和建模,然后通知他们制定一系列发展他们的州际能源契约的目标。
该附件数据文件“Problem CD Ate.XL”提供的第一个工作簿是50年中四个州的能源生产和消费数据的605个变量,伴随一些人口和经济信息。
在这个数据集中,605个变量的名称被定义在第二工作簿中。
第一部分1、使用所提供的数据,为这四个州分别创建一个能量概况。
2、建立一个模型来描述从1960到2009年这四个州的能量是如何演化的。
分析和解释模型的结果,以解决四个州使用清洁和可再生能源的问题,用州长们很容易理解的方式,帮助他们了解四个州之间的异同。
你的讨论包括可能影响异同的的因素3、确定在2009年这四个州中哪一个州有“最佳”使用清洁和可再生能源的概况。
解释你的标准和选择。
4、基于这些州使用能源的历史演变,以及你对所建立的州概况之间差异的理解,如你所定义的那样,在每个州长办公室没有任何政策改变的情况下,分别预测2025和2050年每个州的能源概况。
第二部分1、基于你对这四个州的比较,用你的“最佳”概况的标准和你的预测,来确定2025和2050年的可再生能源使用的目标,并将它们作为新的四州能量契约的目标。
usaco2020dec第五题
usaco2020dec第五题分析【题目描述】usaco2020dec第五题是一个关于排列组合和数学递推的题目。
在本题中,给定一个整数n,要求求解一个长度为n的排列p,并且要求满足以下条件:1. 任意两个相邻的数字i和j,满足$p[i] \leq p[j]$ and $p[j] \leq p[i]+k$,其中k为给定的整数。
2. 满足第一条条件的排列个数对10^9+7取模的结果。
【题目分析】这是一个典型的数学递推题目,在解题过程中,可以通过观察和推导得到一些规律,从而得到排列的个数。
【解题思路】1. 通过观察和举例分析可以发现,设f(i, j)为以第i个数字结尾,长度为j的合法排列数,则f(i, j) = f(i-1, j-1) + f(i, j-1) + ... + f(i-k, j-1),其中k为给定的整数。
2. 利用该递推式,可以逐步求解出以不同数字结尾的长度为j的合法排列数,最后将它们相加即可得到整个排列的个数。
3. 在求解过程中,需要注意处理边界条件和特殊情况。
【代码实现】```c++#include <iostream>#include <vector>using namespace std;const int MOD = 1e9+7;int m本人n() {int n, k;cin >> n >> k;vector<vector<int>> dp(n+1, vector<int>(n+1, 0)); dp[0][0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = (dp[i-1][j-1] + dp[i][j-1])MOD;if (i-k-1 >= 0) {dp[i][j] = (MOD + dp[i][j] - dp[i-k-1][j-1])MOD; }}}int ans = 0;for (int i = 1; i <= n; i++) {ans = (ans + dp[n][i])MOD;}cout << ans << endl;return 0;}```【总结】usaco2020dec第五题是一道典型的排列组合和数学递推题目,通过观察和分析递推规律,可以得到解题思路并实现代码。
USACO月赛题解
USACO2002-2008月赛解题报告USACO 2002 February题目名称题目描述算法Fiber CommunicationsN个人围成一个环,有M对人想要联系,但每次只能连接相邻两个人。
问要满足这M对关系最少要连接几条边。
枚举断开的地方,然后类似染色一样。
用并查集。
Power HungryCows初始时只有X和1,每次你能从现有的两个数中选两个(可以重复),通过乘或者除替换掉其中某个数。
问最少要操作几次能得到X^P。
相当于指数通过加减得到P。
BFS时如果大的那个数不超过50000,而且小的那个数不超过100就进行扩展,否则不扩展。
证明我不会……或者也可以IDA*。
Cow Cycling 有N头奶牛,他们需要跑D圈,刚开始每头奶牛的体力值都为E。
如果跑X圈,那么领跑的奶牛每分钟消耗的体力为X*X,后面的奶牛每分钟消耗的体力是X。
求跑完这D圈最少需要的时间。
F[i][j][k]表示前i-1头奶牛领跑完了,现在是第i头奶牛领跑,已经跑了j圈且奶牛i已经消耗了k的体力需要的最少时间。
F[i][j+x][k+x*x]=min(F[i][j ][k]+1)F[i+1][j][j]=min(F[i][j][k] )Rebuilding Roads有一棵树,你需要砍掉一些边得到一棵节点个数为P的子树。
问最少需要砍掉几条边。
F[i][j]表示以i为根的树,得到了一棵节点个数为j的子树需要砍掉的最少的边数。
Triangular Pastures有N条长度为Li的线段,你要用这些线段拼出一个三角形,使得这个三角形面积最大。
求最大面积。
F[i][j]表示其中一条边长为i,另一条边长为j是否可以达到,第三条边的长度就是总和减去(i+j)。
Chores 有N个任务,除了任务1以外的其他任务都有一些任务需要在这个任务之前完成。
求完成所有任务至少需要多少时间。
F[i]表示能完成任务i的最早时间。
F[i]=max(F[j])+t[i],任务j 需要在任务i之前完成。
USACO心得
USACO心得第一部分动态规划USACO里可用DP解决的题目不少,计有:bigbrn、buylow、charrec、game1、inflate、milk4、money、nocows、nuggets、numtri、range、rectbarn、rockers、stamps、subsets、theme、tour、vans。
首先,有一类典型的题目是与“背包问题”及其变形有关的。
Inflate是加权01背包问题,也就是说:每种物品只有一件,只可以选择放或者不放;而且每种物品有对应的权值,目标是使总权值最大或最小。
它最朴素的状态转移方程是:f[k][i] = max{f[k-1][i] , f[k-1][i-v[k]]+w[k]}。
f[k][i]表示前k件物品花费代价i可以得到的最大权值。
v[k]和w[k]分别是第k件物品的花费和权值。
可以看到,f[k]的求解过程就是使用第k件物品对f[k-1]进行更新的过程。
那么事实上就不用使用二维数组,只需要定义f[i],然后对于每件物品k,顺序地检查f[i]与f[i-v[k]]+w[k]的大小,如果后者更大,就对前者进行更新。
这是背包问题中典型的优化方法。
题目stamps中,每种物品的使用量没有直接限制,但使用物品的总量有限制。
求第一个不能用这有限个物品组成的背包的大小。
(可以这样等价地认为)设f[k][i]表示前k件物品组成大小为i的背包,最少需要物品的数量。
则f[k][i]= min{f[k-1][i],f[k-1][i-j*s[k]]+j},其中j是选择使用第k件物品的数目,这个方程运用时可以用和上面一样的方法处理成一维的。
求解时先设置一个粗糙的循环上限,即最大的物品乘最多物品数。
Money是多重背包问题。
也就是每个物品可以使用无限多次。
要求解的是构成一种背包的不同方案总数。
基本上就是把一般的多重背包的方程中的min改成sum 就行了。
Nuggets的模型也是多重背包。
usaco2023年12月题解
USACO(美国计算机奥林匹克竞赛)是世界各地优秀学生参与的一项重要竞赛,该比赛旨在促进在编程和算法方面的学习和挑战。
每年举办四次比赛,涉及四个级别(铜、银、金、铂金),各级别考试内容逐渐增加难度。
作为一项国际性的编程比赛,USACO的考试题目一直备受关注。
现在就让我们来看一下xxxUSACO的题目及解析。
1. 题目一:最大子数组和本题要求求给定整数数组中的最大子数组和。
解析:这是一道比较基础的动态规划题目。
我们可以使用动态规划算法来求解该问题。
首先我们定义一个数组dp,dp[i]表示当前位置i的最大子数组和。
然后我们可以根据动态规划的状态转移方程来进行求解。
2. 题目二:互不相交子数组给定一个长度为n的数组,求其最大的互不相交子数组之和。
解析:这是一道比较典型的贪心算法题目。
我们可以使用贪心算法来求解该问题。
首先我们定义一个数组dp,dp[i][0]表示以位置i结尾的最大互不相交子数组和,dp[i][1]表示以位置i结尾的不包括位置i的最大互不相交子数组和。
然后我们可以根据贪心算法的策略来进行求解。
3. 题目三:单词搜索给定一个m×n的字符矩阵和一个单词,判断该单词是否存在于字符矩阵中。
解析:这是一道比较典型的回溯算法题目。
我们可以使用回溯算法来求解该问题。
首先我们定义一个vis数组,vis[i][j]表示字符矩阵中位置(i, j)是否已经被访问过。
然后我们可以根据回溯算法的策略来进行求解。
4. 题目四:最长上升子序列给定一个整数数组,求其最长的上升子序列的长度。
解析:这是一道比较经典的动态规划题目。
我们可以使用动态规划算法来求解该问题。
首先我们定义一个数组dp,dp[i]表示以位置i结尾的最长上升子序列的长度。
然后我们可以根据动态规划的状态转移方程来进行求解。
通过以上题目及解析的分析,我们可以看出,USACO xxx的题目在编程和算法方面具有一定的挑战性,需要考生对动态规划、贪心算法、回溯算法等内容有一定的了解和掌握。
USACO上面的动态规划题目
水题6Barn Repair(Section 1.3)修理牛棚译by tim green在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。
好在许多牛正在度假,所以牛棚没有住满。
剩下的牛一个紧挨着另一个被排成一行来过夜。
有些牛棚里有牛,有些没有。
所有的牛棚有相同的宽度。
自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板。
他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。
农民约翰想将他购买的木板总长度减到最少。
给出M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。
输出所需木板的最小总长度作为的答案。
PROGRAM NAME: barn1INPUT FORMATSAMPLE INPUT (file barn1.in)4 50 1834681415161721252627303140414243OUTPUT FORMAT单独的一行包含一个整数表示所需木板的最小总长度。
SAMPLE OUTPUT (file barn1.out)25[ 一种最优的安排是用板拦住牛棚3-8,14-21,25-31,40-43.]Number Triangles(Section 1.5)数字金字塔译by tim green考虑在下面被显示的数字金字塔。
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。
每一步可以走到左下方的点也可以到达右下方的点。
73 88 1 02 7 4 44 5 2 6 5在上面的样例中,从7 到3 到8 到7 到5 的路径产生了最大和:30 PROGRAM NAME: numtriINPUT FORMAT第一个行包含R(1<= R<=1000) ,表示行的数目。
动态规划动态转移方程大全
1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k])2. 资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]);3. 线性动态规划1-----朴素最长非降子序列F:=max{f[j]+1}4. 剖分问题1-----石子合并F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);5. 剖分问题2-----多边形剖分F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a);6. 剖分问题3------乘积最大f[i,j]:=max(f[k,j-1]*mult[k,i]);7. 资源问题3-----系统可靠性(完全背包)F[i,j]:=max{f[i-1,j-c*k]*P[I,x]}8. 贪心的动态规划1-----快餐问题F[i,j,k]:=max{f[i-1,j',k']+(T-(j-j')*p1-(k-k')*p2) div p3}9. 贪心的动态规划2-----过河f=min{{f(i-k)} (not stone){f(i-k)}+1} (stone); +贪心压缩状态10. 剖分问题4-----多边形-讨论的动态规划F[i,j]:=max{正正f[I,k]*f[k+1,j];负负g[I,k]*f[k+1,j];正负g[I,k]*f[k+1,j];负正f[I,k]*g[k+1,j];} g为min11. 树型动态规划1-----加分二叉树(从两侧到根结点模型)F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}12. 树型动态规划2-----选课(多叉树转二叉树,自顶向下模型)F[I,j]表示以i为根节点选j门功课得到的最大学分f[i,j]:=max{f[t.l,k]+f[t.r,j-k-1]+c}13. 计数问题1-----砝码称重f[f[0]+1]=f[j]+k*w[j];(1<=i<=n; 1<=j<=f[0]; 1<=k<=a;)14. 递推天地1------核电站问题f[-1]:=1; f[0]:=1;f:=2*f[i-1]-f[i-1-m]15. 递推天地2------数的划分f[i,j]:=f[i-j,j]+f[i-1,j-1];16. 最大子矩阵1-----一最大01子矩阵f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;ans:=maxvalue(f);17. 判定性问题1-----能否被4整除g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)18. 判定性问题2-----能否被k整除f[I,j±n mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n20. 线型动态规划2-----方块消除游戏f[i,i-1,0]:=0f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),f[i,p,k+len[j]]+f[p+1,j-1,0]}ans:=f[1,m,0]21. 线型动态规划3-----最长公共子串,LCS问题f[i,j]={0(i=0)&(j=0);f[i-1,j-1]+1 (i>0,j>0,x=y[j]);max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x<>y[j]);22. 最大子矩阵2-----最大带权01子矩阵O(n^2*m)枚举行的起始,压缩进数列,求最大字段和,遇0则清零23. 资源问题4-----装箱问题(判定性01背包)f[j]:=(f[j] or f[j-v]);24. 数字三角形1-----朴素の数字三角形f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);25. 数字三角形2-----晴天小猪历险记之Hill同一阶段上暴力动态规划if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]26. 双向动态规划1数字三角形3-----小胖办证f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])27. 数字三角形4-----过河卒//边界初始化f[i,j]:=f[i-1,j]+f[i,j-1];28. 数字三角形5-----朴素的打砖块f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);29. 数字三角形6-----优化的打砖块f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}30. 线性动态规划3-----打鼹鼠’f:=f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j])31. 树形动态规划3-----贪吃的九头龙32. 状态压缩动态规划1-----炮兵阵地Max(f[Q*(r+1)+k],g[j]+num[k])If (map and plan[k]=0) and((plan[P] or plan[q]) and plan[k]=0)33. 递推天地3-----情书抄写员f:=f[i-1]+k*f[i-2]34. 递推天地4-----错位排列f:=(i-1)(f[i-2]+f[i-1]);f[n]:=n*f[n-1]+(-1)^(n-2);35. 递推天地5-----直线分平面最大区域数f[n]:=f[n-1]+n:=n*(n+1) div 2 + 1;36. 递推天地6-----折线分平面最大区域数f[n]:=(n-1)(2*n-1)+2*n;37. 递推天地7-----封闭曲线分平面最大区域数f[n]:=f[n-1]+2*(n-1):=sqr(n)-n+2;38 递推天地8-----凸多边形分三角形方法数f[n]:=C(2*n-2,n-1) div n;对于k边形f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)39 递推天地9-----Catalan数列一般形式1,1,2,5,14,42,132f[n]:=C(2k,k) div (k+1);40 递推天地10-----彩灯布置排列组合中的环形染色问题f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);41 线性动态规划4-----找数线性扫描sum:=f+g[j];(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)42 线性动态规划5-----隐形的翅膀min:=min{abs(w/w[j]-gold)};if w/w[j]<gold then inc(i) else inc(j);43 剖分问题5-----最大奖励f:=max(f,f[j]+(sum[j]-sum)*i-t44 最短路1-----Floydf[i,j]:=max(f[i,j],f[i,k]+f[k,j]);ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];45 剖分问题6-----小H的小屋F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);46 计数问题2-----陨石的秘密(排列组合中的计数问题)Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);47 线性动态规划------合唱队形两次F:=max{f[j]+1}+枚举中央结点48 资源问题------明明的预算方案:加花的动态规划f[i,j]:=max(f[i,j],f[l,j-v-v[fb]-v[fa]]+v*p+v[fb]*p[fb]+v[fa]*p[fa]);49 资源问题-----化工场装箱员50 树形动态规划-----聚会的快乐f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t^.son,0]);f[i,0]:=sigma(f[t^.son,3]);51 树形动态规划-----皇宫看守f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t^.son,0]);f[i,0]:=sigma(f[t^.son,3]);52 递推天地-----盒子与球f[i,1]:=1;f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);53 双重动态规划-----有限的基因序列f:=min{f[j]+1}g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])54 最大子矩阵问题-----居住空间f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),min(f[i,j,k-1],f[i-1,j-1,k])),min(min(f[i-1,j,k-1],f[i,j-1,k-1]),f[i-1,j-1,k-1]))+1;55 线性动态规划------日程安排f:=max{f[j]}+P[I]; (e[j]<s)56 递推天地------组合数C[I,j]:=C[i-1,j]+C[I-1,j-1]C[I,0]:=157 树形动态规划-----有向树k中值问题F[I,r,k]:=max{max{f[l,I,j]+f[r,I,k-j-1]},f[f[l,r,j]+f[r,r,k-j]+w[I,r]]}58 树形动态规划-----CTSC 2001选课F[I,j]:=w(if i∈P)+f[l,k]+f[r,m-k](0≤k≤m)(if l<>0)59 线性动态规划-----多重历史f[i,j]:=sigma{f[i-k,j-1]}(if checked)60 背包问题(+-1背包问题+回溯)-----CEOI1998 Substractf[i,j]:=f[i-1,j-a] or f[i-1,j+a]61 线性动态规划(字符串)-----NOI 2000 古城之谜f[i,1,1]:=min{f[i+length(s),2,1],f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+w ords[s]}62 线性动态规划-----最少单词个数f[i,j]:=max{f[I,j],f[u-1,j-1]+l}63 线型动态规划-----APIO2007 数据备份状态压缩+剪掉每个阶段j前j*2个状态和j*2+200后的状态贪心动态规划f:=min(g[i-2]+s,f[i-1]);64 树形动态规划-----APIO2007 风铃f:=f[l]+f[r]+{1 (if c[l]<c[r])}g:=1(d[l]<>d[r]) 0(d[l]=d[r])g[l]=g[r]=1 then Halt;65 地图动态规划-----NOI 2005 adv19910F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];66 地图动态规划-----优化的NOI 2005 adv19910F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;67 目标动态规划-----CEOI98 subtraF[I,j]:=f[I-1,j+a] or f[i-1,j-a]68 目标动态规划----- Vijos 1037搭建双塔问题F[value,delta]:=g[value+a,delta+a] or g[value,delta-a]69 树形动态规划-----有线电视网f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])leaves>=p>=l, 1<=q<=p;70 地图动态规划-----vijos某题F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);71 最大子矩阵问题-----最大字段和问题f:=max(f[i-1]+b,b); f[1]:=b[1]72 最大子矩阵问题-----最大子立方体问题枚举一组边i的起始,压缩进矩阵B[I,j]+=a[x,I,j]枚举另外一组边的其实,做最大子矩阵73 括号序列-----线型动态规划f[I,j]:=min(f[I,j],f[i+1,j-1](ss[j]=”()”or(”[]”)),f[I+1,j+1]+1 (s[j]=”(”or”[” ] , f[I,j-1]+1(s[j]=”)”or”]” )74 棋盘切割-----线型动态规划f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]min{}}75 概率动态规划-----聪聪和可可(NOI2005)x:=p[p[i,j],j]f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1f[I,i]=0f[x,j]=176 概率动态规划-----血缘关系F[A, B]=(f[A0, B]+P[A1, B])/2f[I,i]=1f[I,j]=0(I,j无相同基因)77 线性动态规划-----决斗F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j78 线性动态规划-----舞蹈家F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])79 线性动态规划-----积木游戏F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k’],f[I,a+1,a+1,k’])80 树形动态规划(双次记录)-----NOI2003 逃学的小孩朴素的话枚举节点i和离其最远的两个节点j,k O(n^2)每个节点记录最大的两个值,并记录这最大值分别是从哪个相邻节点传过来的。
动态规划算法题(5题)
动态规划算法题(5题)1、题⽬描述(⽹易)有 n 个学⽣站成⼀排,每个学⽣有⼀个能⼒值,⽜⽜想从这 n 个学⽣中按照顺序选取 k 名学⽣,要求相邻两个学⽣的位置编号的差不超过d,使得这 k 个学⽣的能⼒值的乘积最⼤,你能返回最⼤的乘积吗?输⼊描述:每个输⼊包含 1 个测试⽤例。
每个测试数据的第⼀⾏包含⼀个整数 n (1 <= n <= 50),表⽰学⽣的个数,接下来的⼀⾏,包含 n 个整数,按顺序表⽰每个学⽣的能⼒值 ai(-50 <= ai <= 50)。
接下来的⼀⾏包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。
输出描述:输出⼀⾏表⽰最⼤的乘积。
试题分析:本题要使⽤动态规划来解,动态规划的特点:1.求解的是最优化问题;2.可以分解为最优⼦结构本题可以先求解在第i个学⽣的位置下,j(j<K)个学⽣的能⼒值的最⼤值,得到所有学⽣位置下j个学⽣的能⼒值的最⼤值;在j个学⽣的情况下,得到j+1个学⽣的最⼤值,样例输出: 10 8 7 2 -7 9 5 4 10 -7 1 3 3输出: 630如上,第⼀步先计算k=2的情况:7:在d=3的情况下,最⼤最⼩值都为562:在d=3的情况下,最⼤值为16,最⼩值为14-7:在d=3的情况下,最⼤值为-14,最⼩值为-56......得到第⼀趟的结果k=3的情况下(这⾥以第⼀趟的结果为基础,只有这样就不需要考虑第⼀趟中d=3的限制):2:在d=3的情况下,最⼤最⼩值都为112(56*2)-7:在d=3的情况下,最⼤值为-98(14*-7)最⼩值为-392(56*-7)9:在d=3的情况下,最⼤值为504(56*9)最⼩值为-504(-56*9)......得到第⼆趟的结果返回最⼤值就是最后的结果#-*- coding:utf-8 -*-n=input()array=[int(i) for i in raw_input().split()]k,d=[int(i) for i in raw_input().split()]# n=36array_max=array_min=array#轮询k-1趟即可for i in range(0,k-1):_max=[-float('inf')]*n#将最⼤值的数组赋值⽆穷⼩_min=[float('inf')]*n#将最⼩值的数组赋值⽆穷⼤for j in range(i+1,n):if j<=d+i:#下⾯对应的min、max都是考虑到array[j]为负值的情况下temp_max = max(max(ii*array[j] for ii in array_max[i:j]),max(ii*array[j] for ii in array_min[i:j]))temp_min = min(min(ii*array[j] for ii in array_max[i:j]),min(ii*array[j] for ii in array_min[i:j]))else:temp_max = max(max(ii*array[j] for ii in array_max[j-d:j]),max(ii*array[j] for ii in array_min[j-d:j]))temp_min = min(min(ii*array[j] for ii in array_max[j-d:j]),min(ii*array[j] for ii in array_min[j-d:j]))_max[j]=temp_max_min[j]=temp_minarray_max=_maxarray_min=_minprint array_maxprint array_minprint max(array_max)2、题⽬描述(腾讯):腾讯⼤厦有39层,你⼿⾥有两颗⼀抹⼀眼的玻璃珠。
acm动态规划例题
acm动态规划例题Problem A:简单的图形覆盖Time Limit:1000MS Memory Limit:65536KTotal Submit:201 Accepted:104Description有一个2*n 的方格,要用若干个1*2的模块覆盖,模块可以横放,也可以竖放.问对于给定的n(n<=100),有多少种不同的覆盖方法.Input有多个测试用例,每个用例占一行,为一个正整数nOutput对于每个测试用例,输出一行相应的结果Sample Input9 11Sample Output55 144分析:f(n)=??>-+-==2)2()1(2211n n f n f n n #include int A[101]; int main() {int n,i;while(scanf("%d",&n)!=EOF) {A[0]=1;A[1]=2;if(n==1||n==0) printf("%d\n",A[0]);else if(n==2) printf("%d\n",A[1]);else{for(i=2;i<n;i++)< p="">A[i]=A[i-1]+A[i-2];printf("%d\n",A[i-1]);}}return 0;}Problem B:最大子段和Time Limit:1000MS Memory Limit:65536KTotal Submit:574 Accepted:299Description有一组数,如-2 5 4 -3 7 的最大子段和是13, 是从5到7.Input第一行输入一个n(1〈N〈=100 ) 表示这一组数有多长,第二行是N个数. 测试案例有多个,n=0时结束.Output输出这一组数的最大子段和.Sample Input5-2 5 4 -3 7109 -3 8 -28 98 -30 -20 50 -24 10Sample Output13 98分析: A-2 5 4 -3 7 B 表示A0~Ai 数段中包含第i 个元素的最大子段和-2 59613B[i]=??>+-=0]}[],[]1[max{0][i i A i A i B i i A#include int A[101]; int B[101]; int main() {int n,i,max;scanf("%d",&n); while(n!=0) {for(i=0;i<="">return 0; }Problem C:最长公共子序列Time Limit:1000MS Memory Limit:65536KTotal Submit:164 Accepted:99Description我们称序列Z=是序列X=的子序列当且仅当存在严格上升的序列,使得对j=1,2,...k,有Xij=zj.比如Z=<a,b,f,c>是X=<a,b,c,f,b,c>的子序列.现在给出两个序列X和Y,任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列.Input输入包括多组测试数据.每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列.两个字符串之间由若干个空格9开.Output对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度.Sample Inputabcfbc abfcabprogramming contestabcd mnpSample Output42分析Z[i][j]=[1][1]1[][]max{[1][],[][1]}[][]Z i j X i Y jZ i j Z i j X i Y j--+=--≠下标0 1 2 3 4 5 6 Z[i][j] a b c f b c0 0 0 0 0 0 0 01 a 0 1 1 1 1 1 12 b 0 1 2 2 2 2 23 f 0 1 2 2 3 3 34 c 0 1 2 3 3 3 45 a 0 1 2 3 3 3 46 b 0 1 2 3 3 4 4X,Y下标从0开始,Z[i][j] 下标有效的从1开始#include#includechar x[201];char y[201];int z[200][200];int main(){int i,j,s,t,max;while(scanf("%s%s",x,y)!=EOF){s=strlen(x);t=strlen(y);for(i=0;i<s;i++)< p="">z[i][0]=0;for(j=0;j<t;j++)< p="">z[0][j]=0;for(i=1;i<=s;i++)for(j=1;j<=t;j++){if(x[i-1]==y[j-1]) z[i][j]=z[i-1][j-1]+1;else{if(z[i-1][j]>=z[i][j-1]) z[i][j]=z[i-1][j];else z[i][j]=z[i][j-1];}}max=z[0][0];for(i=0;i<=s;i++)for(j=0;j<=t;j++)if(z[i][j]>max) max=z[i][j];printf("%d\n",max);}return 0;}Problem D:最长上升子序列Time Limit:1000MS Memory Limit:65536KTotal Submit:456 Accepted:239 Description一个数的序列bi,当b1<=b2<=b3..<=bn的时候,称这个序列是上升的。
【题解】bzoj1597:[Usaco2008Mar]土地购买(动态规划+斜率优化)
【题解】bzoj1597:[Usaco2008Mar]⼟地购买(动态规划+斜率优化)Solution:线性DP打牌\(+\)斜率优化定义状态:\(dp[i]\)到了位置\(i\)最少花费⾸先我们要发现,如果有⼀个⼩⽅块能被其他的⼤⽅块包围,其实可以忽略这个⼩⽅块,因为我们可以把他们俩捆绑,⼩⽅块的边长不会对求值造成贡献然后我们可以按照宽从⼤到⼩排序,长从⼩到⼤(剔除了那种包含的情况),保证单调性我们就可以列出递推式⼦:\(dp[i]=min(dp[j-1]+y[j]*x[i])\)注意是\(dp[j-1]\)(这⾥搞错了好久)显然这个是满⾜决策单调性的嘛(主要是我不会证明)然后我们就可玩弄这个式⼦,假定\(j<k\),那么\(y[j]>y[k]\),\(dp[j-1]<dp[k-1]\),且\(x[i]\)单调增\[dp[j-1]+y[j]*x[i]>dp[k-1]+y[k]*x[i] \]\[dp[j-1]-dp[k-1]>-(y[j]-y[k])*x[i] \]\[\frac{dp[j-1]-dp[k-1]}{y[j]-y[k]}>-x[i] \]然后维护⼀个上凸包就ok了Code://It is coded by Ning_Mew on 5.22#include<bits/stdc++.h>#define LL long longusing namespace std;const int maxn=5e5+7;int n;struct Node{LL x,y;}node[maxn];LL dp[maxn],large=-10000;int team[maxn],s=0,t=1;LL Min(LL a,LL b){return a<b?a:b;}bool cmp(const Node &a,const Node &b){if(a.y!=b.y)return a.y>b.y;return a.x>b.x;}double slope(int i,int j){return 1.0*(dp[i-1]-dp[j-1])/(node[i].y-node[j].y);}int main(){freopen("in.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld%lld",&node[i].x,&node[i].y);}sort(node+1,node+n+1,cmp);s=1;t=2;team[s]=1;dp[1]=node[1].x*node[1].y;large=node[1].x;for(int i=2;i<=n;i++){if(node[i].x<=large){dp[i]=dp[i-1];continue;}large=max(large,node[i].x);while((s+1<t)&&(slope(team[s],team[s+1])>-1.0*node[i].x)){s++;}dp[i]=Min(node[i].x*node[i].y+dp[i-1],dp[ team[s]-1 ]+node[ team[s] ].y*node[i].x);while((s+1<t)&&(slope(team[t-1],i)>slope(team[t-2],team[t-1]))){t--;}team[t]=i;t++;}printf("%lld\n",dp[n]);return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
水题6Barn Repair(Section 1.3)修理牛棚译by tim green在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。
好在许多牛正在度假,所以牛棚没有住满。
剩下的牛一个紧挨着另一个被排成一行来过夜。
有些牛棚里有牛,有些没有。
所有的牛棚有相同的宽度。
自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板。
他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。
农民约翰想将他购买的木板总长度减到最少。
给出M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。
输出所需木板的最小总长度作为的答案。
PROGRAM NAME: barn1INPUT FORMATSAMPLE INPUT (file barn1.in)4 50 1834681415161721252627303140414243OUTPUT FORMAT单独的一行包含一个整数表示所需木板的最小总长度。
SAMPLE OUTPUT (file barn1.out)25[ 一种最优的安排是用板拦住牛棚3-8,14-21,25-31,40-43.]Number Triangles(Section 1.5)数字金字塔译by tim green考虑在下面被显示的数字金字塔。
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。
每一步可以走到左下方的点也可以到达右下方的点。
73 88 1 02 7 4 44 5 2 6 5在上面的样例中,从7 到3 到8 到7 到5 的路径产生了最大和:30 PROGRAM NAME: numtriINPUT FORMAT第一个行包含R(1<= R<=1000) ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
SAMPLE INPUT (file numtri.in)573 88 1 02 7 4 44 5 2 6 5OUTPUT FORMAT单独的一行包含那个可能得到的最大的和。
SAMPLE OUTPUT (file numtri.out)30Subset Sums(Section 2.2)集合对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:•{3} and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:•{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}•{2,5,7} and {1,3,4,6}•{3,4,7} and {1,2,5,6}•{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。
程序不能预存结果直接输出。
PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。
SAMPLE OUTPUT (file subset.out)4Longest Prefix(Section 2.3)最长前缀IOI'96译by Felicia Crazy在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。
生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。
如果一个集合P 中的元素可以通过串联(允许重复;串联,相当于Pascal 中的“+” 运算符)组成一个序列S ,那么我们认为序列S 可以分解为P 中的元素。
并不是所有的元素都必须出现。
举个例子,序列ABABACABAAB 可以分解为下面集合中的元素:{A, AB, BA, CA, BBC}序列S 的前面K 个字符称作S 中长度为K 的前缀。
设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。
PROGRAM NAME: prefixINPUT FORMAT输入数据的开头包括1..200 个元素(长度为1..10 )组成的集合,用连续的以空格分开的字符串表示。
字母全部是大写,数据可能不止一行。
元素集合结束的标志是一个只包含一个“.” 的行。
集合中的元素没有重复。
接着是大写字母序列S ,长度为1..200,000 ,用一行或者多行的字符串来表示,每行不超过76 个字符。
换行符并不是序列S 的一部分。
SAMPLE INPUT (file prefix.in)A AB BA CA BBCABABACABAABCOUTPUT FORMAT只有一行,输出一个整数,表示S 能够分解成P 中元素的最长前缀的长度。
SAMPLE OUTPUT (file prefix.out)11Cow Pedigrees(Section 2.3)奶牛家谱Silviu Ganceanu -- 2003译yangzhe1990农民约翰准备购买一群新奶牛。
在这个新的奶牛群中, 每一个母亲奶牛都生两小奶牛。
这些奶牛间的关系可以用二叉树来表示。
这些二叉树总共有N个节点(3 <= N < 200)。
这些二叉树有如下性质:1.每一个节点的度是0或2。
度是这个节点的孩子的数目。
2.树的高度等于K(1 < K < 100)。
高度是从根到任何叶子的最长的路径上的节点的数目; 叶子是指没有孩子的节点。
有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的。
输出可能的家谱树的个数除以9901的余数。
PROGRAM NAME: nocowsINPUT FORMAT第1行: 两个空格分开的整数, N和K。
SAMPLE INPUT (file nocows.in)5 3OUTPUT FORMAT第 1 行: 一个整数,表示可能的家谱树的个数除以9901的余数。
SAMPLE OUTPUT (file nocows.out)2OUTPUT DETAILS:有5个节点,高为3的两个不同的家谱:@ @/ \ / \@ @ 和@ @/ \ / \@ @ @ @Money Systems(Section 2.3)货币系统译by timgreen母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。
[In their own rebellious way],,他们对货币的数值感到好奇。
传统地,一个货币系统是由1,5,10,20 或25,50, 和100的单位面值组成的。
母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。
举例来说, 使用一个货币系统{1,2,5,10,...}产生18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它。
写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。
保证总数将会适合long long (C/C++) 和Int64 (Free Pascal)。
PROGRAM NAME: moneyINPUT FORMAT货币系统中货币的种类数目是V 。
(1<= V<=25)要构造的数量钱是N 。
(1<= N<=10,000)SAMPLE INPUT (file money.in)3 101 2 5OUTPUT FORMAT单独的一行包含那个可能的构造的方案数。
SAMPLE OUTPUT (file money.out)10Score Inflation(Section 3.1)总分译by timgreen学生在我们USACO的竞赛中的得分越多我们越高兴。
我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。
我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。
你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。
输入包括竞赛的时间,M(1 <= M <= 10,000)(不要担心,你要到了训练营中才会有长时间的比赛)和N,"种类"的数目1 <= N <= 10,000。
后面的每一行将包括两个整数来描述一个"种类":第一个整数说明解决这种题目能得的分数(1 <= points <= 10000),第二整数说明解决这种题目所需的时间(1 <= minutes <= 10000)。
你的程序应该确定我们应该从每个"种类"中选多少道题目使得能在竞赛的时间中得到最大的分数。
来自任意的"种类"的题目数目可能任何非负数(0或更多)。
计算可能得到的最大分数。
PROGRAM NAME: inflateINPUT FORMATSAMPLE INPUT (file inflate.in)300 4100 60250 120120 10035 20OUTPUT FORMAT单独的一行包括那个在给定的限制里可能得到的最大的分数。
SAMPLE OUTPUT (file inflate.out)605{从第2个"种类"中选两题第4个"种类"中选三题}Stamps(Section 3.1)邮票译by Felicia Crazy已知一个N 枚邮票的面值集合(如,{1 分,3 分})和一个上限K —— 表示信封上能够贴K 张邮票。
计算从1 到M 的最大连续可贴出的邮资。
例如,假设有1 分和3 分的邮票;你最多可以贴5 张邮票。
很容易贴出1 到5 分的邮资(用1 分邮票贴就行了),接下来的邮资也不难:• 6 = 3 + 3•7 = 3 + 3 + 1•8 = 3 + 3 + 1 + 1•9 = 3 + 3 + 3•10 = 3 + 3 + 3 + 1•11 = 3 + 3 + 3 + 1 + 1•12 = 3 + 3 + 3 + 3•13 = 3 + 3 + 3 + 3 + 1。