Poj动态规划

合集下载

ACM竞赛简介

ACM竞赛简介
4月,举行校内大赛(暨选拔赛) 5月,参加南京各个高校的邀请赛 9月,参加ACM/ICPC亚洲区网络赛 10月,参加ACM/ICPC亚洲区现场赛 另外,每学期都会有适当的练习赛
SEU ACM/ICPC TEAM
14 2020/10/23
ACM/ICPC比赛形式
– 3人组队,相互合作。 – 1支队伍1台ubuntu机器(提供网络打印服
二、小提示
使用windows操作系统, long long需要用%I64d输出,而linux系 统使用%lld输出
Windows和linux操作系统不同,请同学 们格外小心。
Printf和cout不要混用,输出会出错。
调试的sample input的拷贝
SEU ACM/ICPC TEAM
SEU ACM/ICPC TEAM
18 2020/10/23
ACM队队员的基本原则
基本要求
– 人品好 – 愿意花时间在这项赛事上 – 有团队合作精神
能力要求
– 程序设计(C++/Java/数据结构/算法) – 英语科技文献阅读
– 数学
SEU ACM/ICPC TEAM
19 2020/10/23
… 2012年:天津理工、浙江师范、浙江理工 东北师范、成都东软 2013年:南京理工…
SEU ACM/ICPC TEAM
6 2020/10/23
SEU ACM/ICPC TEAM
7 2020/10/23
ACM in SEU
东南大学自05年开始正式参加ACM Regional赛区
05年北京赛区 三等奖 06年西安赛区 铜奖 07年南京赛区 银奖 07年吉林赛区 铜奖 07年成都赛区 银奖
29 2020/10/23

lis算法解析

lis算法解析

介绍一:LIS(Longest Increasing Subsequence)最长上升(不下降)子序列,有两种算法复杂度为O(n*logn)和O(n^2)。

在上述算法中,若使用朴素的顺序查找在D1..Dlen查找,由于共有O(n)个元素需要计算,每次计算时的复杂度是O(n),则整个算法的时间复杂度为O(n^2),与原来算法相比没有任何进步。

但是由于D的特点(2),在D中查找时,可以使用二分查找高效地完成,则整个算法时间复杂度下降为O(nlogn),有了非常显著的提高。

需要注意的是,D 在算法结束后记录的并不是一个符合题意的最长上升子序列!算法还可以扩展到整个最长子序列系列问题。

有两种算法复杂度为O(n*logn)和O(n^2)O(n^2)算法分析如下(a[1]...a[n] 存的都是输入的数)1、对于a[n]来说,由于它是最后一个数,所以当从a[n]开始查找时,只存在长度为1的不下降子序列;2、若从a[n-1]开始查找,则存在下面的两种可能性:(1)若a[n-1] < a[n] 则存在长度为2的不下降子序列a[n-1],a[n].(2)若a[n-1] > a[n] 则存在长度为1的不下降子序列a[n-1]或者a[n]。

3、一般若从a[t]开始,此时最长不下降子序列应该是按下列方法求出的:在a[t+1],a[t+2],...a[n]中,找出一个比a[t]大的且最长的不下降子序列,作为它的后继。

4、为算法上的需要,定义一个数组:d:array [1..n,1..3] of integer;d[t,1]表示a[t]d[t,2]表示从i位置到达n的最长不下降子序列的长度d[t,3]表示从i位置开始最长不下降子序列的下一个位置最长不下降子序列的O(n*logn)算法先回顾经典的O(n^2)的动态规划算法,设A[t]表示序列中的第t个数,F[t]表示从1到t 这一段中以t结尾的最长上升子序列的长度,初始时设F[t] = 0(t = 1, 2, ..., len(A))。

POJ 1185 炮兵阵地

POJ 1185 炮兵阵地

算法加速
有很多,可以同时实现也可以分别实现. 可以预先判断出2 可以预先判断出2种状态是否相容,这样循 环扫描时可以直接剪枝. 可以预先判断出第i行和第j 可以预先判断出第i行和第j种状态是否相容. 自己定义某种快速映射去判断.
时空代价
时间代价 O(N*lm*lm*lm) 空间代价 O(lm*lm)
基本数据结构
Pre[60][60],now[60][60] 对新行进行扫描时 for(i=0;i<lm;i++)for(j=0;j<lm;j++) for(k=0;k<lm;k++){ 如果当前行,前一行,前二行分别是第i 如果当前行,前一行,前二行分别是第i, j,k个状态,并且都能够相容.而now [j] 个状态,并且都能够相容.而now [i]<pre [k] [j]+第i个状态新增的cannon数. [j]+第 个状态新增的cannon数. 那么更新now [i]. 那么更now [j] [i]. }
状态处理
如果我们采用3 如果我们采用3进制方式来表示一行的所有 状态,那么会有每行会有3^M个状态,加上 状态,那么会有每行会有3^M个状态,加上 要重复扫描N次.因此在最坏情况下(M 要重复扫描N次.因此在最坏情况下(M= 10,N=100,所有地点都是平原),会扫 10, 100,所有地点都是平原),会扫 描到所有的3^10*100个状态,加上每个状 描到所有的3^10*100个状态,加上每个状 态会被多次扫描到,因此不十分可取.
具体选择
分析一个列为10( 分析一个列为10(M的最大值)的表.注意 到一个全为P的空列上一共也只有60种合法 到一个全为P的空列上一共也只有60种合法 的Cannon放置方法.具体对一个列数为10 Cannon放置方法.具体对一个列数为10 的PH表而言,对每一列也只有前两列对其 PH表而言,对每一列也只有前两列对其 产生影响,因此我们可以用一个二维数组 cal [lm] [lm]来记录其上一行处于第x种状态, [lm]来记录其上一行处于第x 该行自身出于第y 该行自身出于第y种状态时,从首行扫描到 该行时所能存放的最多cannon数.其中lm是 该行时所能存放的最多cannon数.其中lm是 列数为M 列数为M时一列的所有可能合法放置方法, x,y在0到lm-1之间. lm-

POJ2479Maximumsum解题报告

POJ2479Maximumsum解题报告

POJ2479Maximumsum解题报告Maximum sumTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 40596Accepted: 12663DescriptionGiven a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:Your task is to calculate d(A).InputThe input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.OutputPrint exactly one line for each test case. The line should contain the integer d(A).Sample Input1101 -12 23 -34 -45 -5Sample Output13HintIn the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.Huge input,scanf is recommended.Source,Author:Mathematica@ZSU题⽬⼤意:给定⼀个整数数字序列s,要求使两段不相交的⼦序列s1,s2的和最⼤题解:动态规划ls[i]表⽰以第i个元素结尾序列的最⼤值rs[i]表⽰以第i个元素开始序列的最⼤值rst[i]表⽰取i个元素能够达到的最⼤值所以有ls[i]=max(ls[i-1]+a[i], a[i]), rs[i]=max(rs[i+1]+a[i], a[i])rst[i]=max(rst(i+1), rs[i])所以最后的答案是s=max(s, ls[i]+rst(i+1))#include <stdio.h>#include <string.h>#include <cstdio>#include <iostream>using namespace std;const int maxn = 1e6+7, inf = -1e6+7;int a[maxn], ls[maxn], rs[maxn], s, rst[maxn]; int main(){int t, n;scanf("%d", &t);while (t--){s = 0;memset(ls, 0, sizeof(ls));memset(rs, 0, sizeof(rs));memset(rst, 0, sizeof(rst));scanf("%d", &n);for (int i=0; i<n; i++)scanf("%d", &a[i]);ls[0] = a[0];for (int i=1; i<n; i++) {ls[i] = max(ls[i-1]+a[i], a[i]);}rst[n-1] = rs[n-1] = a[n-1];for (int i=n-2; i>=0; i--){rs[i] = max(rs[i+1]+a[i], a[i]);rst[i] = max(rst[i+1], rs[i]);}s = inf;for (int i=0; i<n-1; i++) {s = max(s, ls[i]+rst[i+1]);}printf("%d\n", s);}return 0;}。

dp总结

dp总结

BZOJ1004
Description
何劲范现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前何劲范只有3种颜色:红色,蓝色,绿色.他询 问Sun有 多少种染色方案,Sun很快就给出了答案.进一步,何劲范要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少 种方 案,Sun想了一下,又给出了正确答案. 最后何劲范发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色 方案. 两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次) 洗 成另一种.Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).
Input
第一行一个N,表示序列一共有N个元素第二行N个数,为a1,a2,…,an 第三行一个M,表示询问次数。下 面接M 行每行一个数L,表示要询问长度为L的上升序列。N<=10000,M<=1000
Output
对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.
首先求出以每个数为开头上升序列长度,即倒着做最长下降子序列 然后,把字典序尽量小的放前面 即若要求的序列长度为x,如果以第一个数(字典序最小的数)开头的最长上升子 序列大等于x,则将它放在答案第一个,第二个数开头小于x,则舍弃,第三个大于 x-1,放答案第二个,以此类推
• • • • • • •
我们令dp[i][j]表示i-j这段区间最少涂色次数 分两种情况 1:s[i] s[j]一样 f[i][j]=min(f[i+1][j],f[i][j-1]); f[i][j]=min(f[i][j],f[i+1][j-1]+1); 2:s[i] s[j]不一样 f[i][j]=min(f[i][k]+f[k+1][j],f[i][j])

状压DP

状压DP
【POJ1185】炮兵阵地--经典状压DP
类似于上面一道题,一个方格组成的矩阵(N*M, N<=100, M<=10),每个方格可 以放大炮用P表示,不可以放大炮用H表示,让放最多的大炮。大炮与大炮间不会互 相攻击。(图示为大炮的攻击范围)
解题思路: dp[i][j][k] 表示第i行状态为k,第i-1行状态为j时的最大炮兵个数 dp[i][k][t] =max(dp[i][k][t],dp[i-1][j][k]+num[t]); num[t]为t状态中1的个数 其中 (t&j)==0, (t&k)==0
状压DP
判断一行是否有相邻距离小于3的1 1.bool ok(int x){ 2. if(x&(x<<1)) return 0; 3. if(x&(x<<2)) return 0; 4. return 1; 5.}
练习地址: /vjudge/contest/vie w.action?cid=124250#overview

பைடு நூலகம்据规模比较小,可以进行可行的压缩。
状压DP
状态的表示:位压缩 比如10个灯,用 2^10 分别表示这10个灯亮还是不亮 3进制、4进制。。。。。 位运算的引入 按位与运算 (and) 效果是 全一为一,反之为零。 按位或运算 (or) 效果是 有一为一,反之为零。 按位异或运算 (xor) 效果是 不同为一,反之为零。
状压DP
状压DP
状态压缩动态规划跟普通的动态规划其实没啥区别,就是状态表示不一样 一个用数组直接做状态,一个用int值做状态 状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规 划问题

ACM新手入门指南

ACM新手入门指南

ACM/ICPC新手入门指南前言:这篇指南不对ACM/ICPC国际大学生程序设计竞赛进行介绍,计算机学子如果不了解的可以在百度上进行搜索查询,这里介绍的只是一个计算机学生想要在ACM/ICPC里进行发展的初学者。

内容比较简单通俗,完全是给新接触的人看的,已经接触过的请飘过,该干嘛的干嘛去。

语言关:要进行程序设计,也就必然要熟悉编程语言,只要掌握了一门语言,就可以进行ACM训练了。

一般通用语言如C、C++、JAVA都可以,这三种语言都有自己的优势和缺点,C在效率方面比较好;但C++封装了输入输出流,方便了我们的操作也减少出错的可能性,而且C++提供了非常强大的标准模版库(STL),使得很多在C上实现起来比较麻烦的代码,在C++上却非常方便;JAVA在大型工程和安全方面都有比较独特的优势,但在ACM里面却不是一种优秀的语言,因为JAVA的执行效率要比C、C++慢很多,如果题目限时比较紧的话,就不适合用JAVA,当然JAVA为我们提供了很方便的高精度运算(大整数运算),所以个人认为,刚学完C的可以用纯C来写训练,在训练过程中可以学学C++,有时间的把STL也好好学学,这样可以减少很多不必要的劳动。

初次接触ACM训练的同学经常会遇到问题,就是输入和输出问题,所以如果对语言的输入输出问题不是很熟悉的话,要抽几天时间重点看看,特别有些初学者在输出时总会输出冗余信息,可能认为有交互性吧,但这是ACM不允许的,它不需要任何交互性。

不严格按照题目要求进行输入输出的程序是无法通过系统测试的。

熟悉在线评测系统在线评测系统,英文叫Online Judge,(简称OJ)里面提供了很多题目给我们平时训练之用。

这里以浙江大学的在线评测系统为例,网址是 先在上面进行注册,注册完后就可以进行题目的训练了,点击主页上的“Problems”,就可以看到里面的题库,可以选任何一个题来做,里面的题目不是由易到难进行排列,而初学者要选择比较简单的题目来做。

ACM训练计划建议(转)

ACM训练计划建议(转)

ACM训练计划建议(转)前⾔:⽼师要我们整理⼀份训练计划给下⼀届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供⼤家参考。

菜鸟之作,⼤⽜勿喷,如有不当或补充之处,欢迎指出。

本建议书分为三个阶段,⼤⼀、⼤⼆、⼤三。

⼤四暂没整理,⼀⽅⾯是⼤四要⾯临考验和找⼯作的问题,坚持继续acm的很少,另⼀⽅⾯,本⼈还没⼤四……下⾯以个⼈经验分析⼀下这三个阶段建议学习的内容和具体的训练计划。

正⽂:⼤⼀(第⼀阶段): ⼤⼀是时间最充裕的⼀段时间,也是可塑性最⾼的⼀个阶段。

⼤⼀你有很多⾃由时间可以⾃⼰分配,建议这段时间先打好c/c++基础,或者是任何⼀门语⾔的基础,尽量做到“半精通”。

因为像c++这种语⾔,⼏年内达到精通都是不可能的。

⽽我这⾥所说的“半精通”,实际上是将课本完全搞透的基础上,再在课外拓展⼀些内容,加深对语⾔本⾝的理解。

为什么我这⾥强调语⾔的重要性呢?⼀⽅⾯是为了以后搞acm的需要,语⾔通畅了,可以保证你实现⼤部分算法没有障碍,⽽⽐赛时,时间是很重要的。

另⼀⽅⾯,也是你⾝为学计算机的学⽣的⼀个必须要学习的能⼒,语⾔就是你⼿中的剑,以后能披荆斩棘⾛多远,剑有多锋利占很⼤因素。

另⼀⽅⾯,建议打好数学的基础。

学长⾝为过来⼈,深受数学烂的苦。

acm越到后期的时候,其实⽤到的数学知识就越多。

像有些题⽬,⾚裸裸的就是求积分,还有⼀些题⽬,将求期望嵌⼊到了DP的题⽬⾥…… 其实这些还好说,都是显式的题⽬,还有⼀种隐式的东西,对acm帮助最⼤,那就是数学思维。

有数学思维和没有数学思维的区别,就是⼀道题有N种思路和N*N种思路的区别。

这越到后期越明显,思路很重要,⽐赛时⾯对⼀道题团队⾥⾸先要有多种思路可供分析,然后⼤家讨论哪种思路是最可⾏的,确定之后就是最擅长这个思路的⼈实现算法。

如果分析⼀道题⽬的时候,产⽣的思路很少,那么⽆疑会降低这道题的AC命中率。

啰嗦了这么多,其实我就想给⼤⼀的新⽣们强调两点,语⾔和数学。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[1]POJ 动态规划题目列表容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈), 1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936,1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029,2039, 2063, 2081, 2082,2181, 2184, 2192, 2231, 2279, 2329, 2336, 2346, 2353,2355, 2356, 2385, 2392, 2424,不易:1019,1037, 1080, 1112, 1141, 1170, 1192, 1239, 1655, 1695, 1707,1733(区间减法加并查集), 1737, 1837, 1850, 1920(加强版汉罗塔), 1934(全部最长公共子序列), 1937(计算几何), 1964(最大矩形面积,O(n)算法), 2138, 2151, 2161(烦,没写), 2178,推荐:1015, 1635, 1636(挺好的), 1671, 1682, 1692(优化), 1704, 1717, 1722, 1726, 1732, 1770, 1821, 1853, 1949, 2019, 2127, 2176, 2228, 2287, 2342, 2374, 2378, 2384, 2411状态DP树DP构造最优解四边形不等式单调队列1015 Jury Compromise1029 False coin1036 Gangsters1037 A decorative fence1038 Bugs Integrated, Inc.1042 Gone Fishing1050 To the Max1062 昂贵的聘礼1074 Parallel Expectations1080 Human Gene Functions1088 滑雪1093 Formatting Text1112 Team Them Up!1141 Brackets Sequence1143 Number Game1157 LITTLE SHOP OF FLOWERS1159 Palindrome1160 Post Office1163 The Triangle1170 Shopping Offers1178 Camelot1179 Polygon1180 Batch Scheduling1185 炮兵阵地1187 陨石的秘密1189 钉子和小球1191 棋盘分割1192 最优连通子集1208 The Blocks Problem1239 Increasing Sequences1240 Pre-Post-erous!1276 Cash Machine1293 Duty Free Shop1322 Chocolate1323 Game Prediction1338 Ugly Numbers1390 Blocks1414 Life Line1432 Decoding Morse Sequences 1456 Supermarket1458 Common Subsequence1475 Pushing Boxes1485 Fast Food1505 Copying Books1513 Scheduling Lectures1579 Function Run Fun1609 Tiling Up Blocks1631 Bridging signals 2分+DP NLOGN 1633 Gladiators1635 Subway tree systems1636 Prison rearrangement1644 To Bet or Not To Bet1649 Market Place1651 Multiplication Puzzle1655 Balancing Act1661 Help Jimmy1664 放苹果1671 Rhyme Schemes1682 Clans on the Three Gorges 1690 (Your)((Term)((Project)))1691 Painting A Board1692 Crossed Matchings 1695 Magazine Delivery 1699 Best Sequence1704 Georgia and Bob1707 Sum of powers1712 Flying Stars1714 The Cave1717 Dominoes1718 River Crossing1722 SUBTRACT1726 Tango Tango Insurrection 1732 Phone numbers1733 Parity game1737 Connected Graph1740 A New Stone Game 1742 Coins P1745 Divisibility1770 Special Experiment 1771 Elevator Stopping Plan 1776 Task Sequences1821 Fence1837 Balance1848 Tree1850 Code1853 Cat1874 Trade on Verweggistan 1887 Testing the CATCHER 1889 Package Pricing1920 Towers of Hanoi1926 Pollution1934 Trip1936 All in All1937 Balanced Food1946 Cow Cycling1947 Rebuilding Roads1949 Chores1952 BUY LOW, BUY LOWER 1953 World Cup Noise1958 Strange Towers of Hanoi 1959 Darts1962 Corporative Network 1964 City Game1975 Median Weight Bead 1989 The Cow Lineup2018 Best Cow Fences2019 Cornfields2029 Get Many Persimmon Trees2033 Alphacode2039 To and Fro2047 Concert Hall Scheduling2063 Investment2081 Recaman's Sequence2082 Terrible Sets2084 Game of Connections2127 Greatest Common Increasing Subsequence 2138 Travel Games2151 Check the difficulty of problems2152 Fire2161 Chandelier2176 Folding2178 Heroes Of Might And Magic2181 Jumping Cows2184 Cow Exhibition2192 Zipper2193 Lenny's Lucky Lotto Lists2228 Naptime2231 Moo Volume2279 Mr. Young's Picture Permutations2287 TianJi -- The Horse Racing2288 Islands and Bridges2292 Optimal Keypad2329 Nearest number - 22336 Ferry Loading II2342 Anniversary party2346 Lucky tickets2353 Ministry2355 Railway tickets2356 Find a multiple2374 Fence Obstacle Course2378 Tree Cutting2384 Harder Sokoban Problem2385 Apple Catching2386 Lake Counting2392 Space Elevator2397 Spiderman2411 Mondriaan's Dream2414 Phylogenetic Trees Inherited2424 Flo's Restaurant2430 Lazy Cows2915 Zuma3017 Cut the Sequence3028 Shoot-out3124 The Bookcase3133 Manhattan Wiring3345 Bribing FIPA3375 Network Connection3420 Quad Tiling ?/?cat=5[2]动态规划方法总结1. 按状态类型分写在前面:从状态类型分,并不表示一题只从属于一类。

其实一类只是一种状态的表示方法。

可以好几种方法组合成一个状态,来解决问题。

1.1. 编号(长度)动态规划共性总结:本类的状态是基础的基础,大部分的动态规划都要用到它,成为一个维。

一般来说,有两种编号的状态:1、状态(i)表示前i个元素决策组成的一个状态。

2、状态(i)表示用到了第i个元素,和其他在1到i-1间的元素,决策组成有的一个状态。

题库:a) 最长不下降子序列以一元组(i)作为状态,表示第i个作为序列的最后一个点的时候的最长序列。

于是很容易想到O(n2)得算法。

但本题可合理组织状态,引入一个单调的辅助数组,利用单调性二分查找,优化到O(nlogn)。

关于优化详见优化章。

一些问题可将数据有序化,转化成本题。

应用:拦截导弹(NOIP99 Advance 1) 就是原题。

Beautiful People (sgu199),要将数据有序化:其中一个权作为第一关键字不下降排列,另一个权作为第二关键字不上升。

Segment (ural 107,将线段的左端点有序化就可以了。

b) LCS状态(i,j),表示第1个字符串的第i位,与第2个字符串的第j位匹配,得到的最长的串。

若有多个串要LCS,则加维,即几个串就几个维。

我也将此题归入路径问题。

c) 花店橱窗布置(IOI99)见路径问题。

1.2. 区间动态规划共性总结:本类问题与下一章的划分问题的决策的分割点无序交集比较大(占本类问题的30%)。

相关文档
最新文档