随笔分类 -  ACM_DP

摘要:题目链接:http://poj.org/problem?id=3017 这题的DP方程是容易想到的,f[i]=Min{ f[j]+Max(num[j+1],num[j+2],......,num[i]) | 满足m的下界 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #i... 阅读全文
posted @ 2013-07-17 00:17 zhsl 阅读(290) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3420 非常经典的题目,推荐看<十个利用矩阵乘法解决的经典题目>。先求出相邻两列的状态转移矩阵,然后用矩阵乘法优化,相当于求在一个图上求两点之间有多少条路径数。 1 //STATUS:C++_AC_0MS_172KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 //#include <ext/rope> 6 #include <fstream> 7 #includ 阅读全文
posted @ 2013-05-24 12:34 zhsl 阅读(442) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2663 http://poj.org/problem?id=2506 简单的递推题,直接递推过去就可以了。POJ-2663: 1 //STATUS:C++_AC_0MS_172KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #i... 阅读全文
posted @ 2013-05-24 12:15 zhsl 阅读(356) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2287 题目很容易误以为是最大匹配,不过O( n^3 )的复杂度承受不了,必须用贪心或者DP策略了。 容易想到先排序,然后贪心,贪心策略如下: 1.如果田忌最慢的马比齐王最慢的马快,那么赢一局。 2.如果田忌最慢的马比齐王最慢的马慢,那么拿田忌最慢的马浪费掉齐王最快的马,输一局。 3.如果田忌最慢的马和齐王最慢的马一样快: (1)如果田忌最快的马比齐王最快的马快,那么赢一局。 (2)如果田忌最快的马比齐王最慢的马慢,那么拿田忌最慢的马浪费掉齐王最快的马,输一局。 (3)如果田... 阅读全文
posted @ 2013-05-21 12:11 zhsl 阅读(495) 评论(0) 推荐(0)
摘要:1877题目链接:http://poj.org/problem?id=1887 3903题目链接:http://poj.org/problem?id=3903 数据大,线性优化,O(n*logn)。1877: 1 //STATUS:C++_AC_16MS_172KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 //#include <ext/rope> 6 #include <fstream> 7 #include <sstream 阅读全文
posted @ 2013-05-21 01:53 zhsl 阅读(213) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1631先确定一方有序后,就是LIS问题了。 仔细观察上图:红色航线是合法的,那么他们满足什么规律呢? C1 C2 C3 C4北岸红线的端点: 4 9 15 17南岸红线的端点: 2 8 12 17 D1 D2 D3 D4不难看出无论线的斜率如何,都有这样的规律: C1<C2<C3<C4 且 D1<D2<D3<D4如果我们把输入数据排升序,问题变抽象为:在一个序列(D)里找到最长的序列满足DI<DJ<Dk……且i<j<k这样的话便是典型的最长非降子序列问题了。。。。法... 阅读全文
posted @ 2013-05-21 01:48 zhsl 阅读(480) 评论(0) 推荐(0)
摘要:联合训练赛中遇到的(以后留给新生做):1.排列的逆序数题目描述{1,2...n}的所有排列中逆序数为k的排列个数。输入多组样例,每组样例: n, k ( 1≤n≤100, 0≤k≤n*(n-1)/2)输出对于每个样例,输出排列个数,答案模1000000007。样例输入2 1样例输出1简单DP,转移方程: f[i][j]为前i个数所有排列中逆序数为j的个数,则f[i][j]=Σ( f[i-1][k] | max(0,j-i+1)<k<=j )。 1 //STATUS:C++_AC_93MS_1348KB 2 #include <functional> 3 #include 阅读全文
posted @ 2013-05-21 01:39 zhsl 阅读(383) 评论(0) 推荐(1)
摘要:题目链接:http://poj.org/problem?id=3691 首先庆祝1A。 如果是单串的匹配,那么状态转移方程就是f[i][j],表示匹配串的前 i 位最近9个数字的状态是 j 的最小改动,每个状态用状态压缩表示下就可以了。复杂度是指数级,对于较小的字符串还是可以接受的。但是这个有很多不必要的情况,因为很多转移都可以归纳到一起,即修改或者不修改,因此把方程改为表示匹配串的第 i 为模板串的第 j 个节点时的最优解,那么对于每个节点就只有4种转移状态了,即一个单串的DFA。同样,我们对于多个串建立一个AC自动机就可以了,转移方程:f[i][j]=Min{ f[i][j] ,... 阅读全文
posted @ 2013-05-03 21:36 zhsl 阅读(331) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2778 [摘自Matrix67] 题目大意是,检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。合法的DNA只能由ACTG四个字符构成。题目将给出10个以内的病毒片段,每个片段长度不超过10。数据规模n<=2 000 000 000。 下面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例,说明怎样像上面的题一样通过构图将问题转化为例题8。我们找出所有病毒片段的前缀,把n位DNA分为以下7类:以AT结尾、以AA结尾、以GG结尾、以?A结尾、以?G结尾、以?C结尾和以??结尾。其中问号表示“其它情况. 阅读全文
posted @ 2013-05-03 11:25 zhsl 阅读(335) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1699 太爽了这题,1AC。容易想到用状态压缩DP来做,f[k][i][j]表示当前 i 状态有 k 个串并且串以 j 结尾的最短串。则 f[k][i][rt]=Min{ f[k][i][rt] , f[k][st][r]+len[j]+g[r][j] }。其中状态 i 用位运算表示所包含的具体的串,1010表示包含串2和4。这里要注意转移方程中的rt,要考虑串包含的情况。 1 //STATUS:C++_AC_0MS_324KB 2 #include<stdio.h> 3 #include<stdlib.h> 阅读全文
posted @ 2013-04-10 00:34 zhsl 阅读(542) 评论(1) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 状态转移方程还是很好想的:f[i][j]表示第 i 个节点放 j 个机器人的最优解,f[i][j]=Min{ f[i][j] , f[i][j-k] + f[v][k] + (k?k:2)*e[i].w } 。 写这个树形DP的时候,暴露了我以前没有仔细考虑的问题,导致状态转移的时候删删改改了很久。、 1.仔细考虑转移方程初始化的问题,要根据求Min或者Max以及容量是否恰好来确定。 2.在分组背包转移时,f[i][j]是前几组的最优值。 1 //STATUS:C++_AC_25... 阅读全文
posted @ 2013-04-09 21:18 zhsl 阅读(405) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1964 空白区域之间有权值,求经过所有空白区域的哈密顿回路的最小权值。简单的插头DP,空白区域特殊处理即可。 1 //STATUS:C++_AC_203MS_664KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include 阅读全文
posted @ 2013-04-07 13:02 zhsl 阅读(304) 评论(0) 推荐(0)
摘要:题目链接:http://acm.fzu.edu.cn/problem.php?pid=1977 题目(备份):View Code Problem DescriptionThe pollution of the earth is so serious that people can not survive any more. Fortunately, people have found a new planet that maybe has life, and we call it "Pandora Planet".Leonardo Da Vinci is the only 阅读全文
posted @ 2013-04-03 17:51 zhsl 阅读(444) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3133 用两条线段分别连接2-2和3-3,使得他们长度的总和最小。 典型的插头DP题目,用0,2,3,种状态来表示每个格子的插头分别是没有插头,2号插头,3号插头,然后把所有可能的转移情况列出来,只是情况比较多,而且一定要考虑仔细,不然检查代码会很惨的。。话说A完这道题后感觉真爽啊O(∩_∩)O~ 1 //STATUS:C++_AC_360MS_900KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #inclu 阅读全文
posted @ 2013-04-03 13:12 zhsl 阅读(364) 评论(0) 推荐(0)
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3399 要注意此题的班级必须是连续的!!! 转移方程容易想出来:f[i][j]表示前 i 个班级分 j 个学生的最优解,那么 f[i][j]=Min{ f[i-1][k] + Σ(x[k]-L)^2*g[i] | j-B<=k<=j-A },然后预处理Σ(x[k]-L)^2 -> s[k]。则 f[i][j]=Min{( f[i-1][k] - s[k]*g[i] ) + s[j]*k| j-B<=k<=j-A },注意到 f[i] 阅读全文
posted @ 2013-04-02 01:14 zhsl 阅读(376) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1739 完全可以用Ural 1519 Formula 1 插头DP(单回路)的代码解决此题,只要把图修改一下: .... ........ .... -> .######. .... .#....#. .#....#. .#....#. ........ 当然也可以在起点和终点独立处理插头。修改建图:View Code 1 //S... 阅读全文
posted @ 2013-04-01 01:18 zhsl 阅读(375) 评论(0) 推荐(0)
摘要:题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1519 一条哈密顿回路路,反正是写到蛋疼了,不过终于解决了,插头DP这玩意,太容易出错了,要注意block的处理。 1 //STATUS:C++_AC_343MS_961KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 阅读全文
posted @ 2013-04-01 01:10 zhsl 阅读(619) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1693 插头DP的入门题,属于轮廓动态规划一类,推荐看《基于连通性状态压缩的动态规划问题》,陈丹琦写的,Orz女神... 1 //STATUS:C++_AC_0MS_272KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #inc 阅读全文
posted @ 2013-03-29 01:50 zhsl 阅读(303) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1160 f[i][j]表示前 i 个村庄放 j 个邮局的最小花费,w[i][j]表示 i-j 村庄之间放一个邮局的最小花费,则转移方程:f[i][j]= Min{ f[k][j-1] + w[k+1][i] },把f[i][j]转换一下,表示前 j 个村庄放 i 个邮局的最小花费,则 f[i][j]=Min{ f[i-1][k] + w[k+1][i] }。 四边形不等式优化有如下定理: 1.当决策代价函数w[i][j]满足w[i][j]+w[i’][j’]<=w[I;][j]+w[i][j’](i<=i’<=j 阅读全文
posted @ 2013-03-26 13:39 zhsl 阅读(368) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2355 简单的DP,转移方程:f[i][j]=Min { f[i][k] + C(n) },注意到f[i][j]是单调递增的,用二分搜索优化即可。注意到此题有个trick,那就是s>e!!! 1 //STATUS:C++_AC_16MS_252KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #inclu 阅读全文
posted @ 2013-03-26 13:16 zhsl 阅读(238) 评论(0) 推荐(0)