随笔分类 -  ACM 动态规划

摘要:Click here多线程DP,第一次看到这个名词。其实也还好,其实就是多个进程同时进行。题意 :从(1,1)走到(N,N),每次只能向下或者向右走,然后在走回(1,1)每次只能向上或者向左走。然后每个点上都有一个值,问你途径所能获得的值最大是多少,并且每个点只能走一次。思路 : 从(1,1)走出两条路来,开一个四维状态保存两个点的坐标。即 : DP[x1][y1][x2][y2];然后就开始DP了。#include #include #include using namespace std; const int MAXN = 33; const int INF = 9999999;... 阅读全文
posted @ 2013-09-14 20:56 cnwsycf 阅读(358) 评论(0) 推荐(0)
摘要:自己每周挂一些题目玩玩,希望自己能够快点成长起来。这是一组关于动态规划的题目。Click here第1题:HDOJ-2182 Frog题意 : 告诉你一个的序列,每一个的值得意思是在这个位置的虫子的数量。然后再告诉你两个数A、B,表示的是Frog每一次能够跳X = [A,B]的距离,然后还有一个跳的次数的限制。让你求最大可以吃掉的数量。思路 : 典型的DP问题,首先明确一点跳K次获得最优解必定大于或等于K-1次的最优解,然后要注意有些点可能是跳不到的。dp[i][j] : 跳j次到达i的最优解。状态转移方程 : dp[i][j] = dp[k][j-1] + aa[i] (A #include 阅读全文
posted @ 2013-09-11 21:45 cnwsycf 阅读(171) 评论(0) 推荐(0)
摘要:昨天在队长的blog上看到了一组DP题的题解,好像是给我们新队员做的,不过我发现我没做过(囧),手痒就敲了。here1 . poj - 2817WordStack题意 : 给你一些字符串,让你给它们排个序,然后 在可以前置0的情况下,求能获得的最大配对数量。思路 : 先预处理出任意两个字符串之间的最大配对数量,然后状态压缩求最大排列(似乎有人全排列也过了,orz)用一个dp[i][k]数组记录当状态为i并且最后一个加进去的是k的最优值#include #include #include using namespace std; typedef __int64 LL; #define ... 阅读全文
posted @ 2013-09-02 10:36 cnwsycf 阅读(190) 评论(0) 推荐(0)
摘要:关于最大连续子序列问题,我以前学DP的时候做过(Max Sum HDU1003)这道题,不过那时候只是草草的学了下,代码还是参考别人的,不懂原理,昨天在CF上做到类似的题目,然后跪了几把,决定把这类题目重新做了下(其实也就只是做了3道题目)首先 : 关于求一段整数序列的最大连续子序列的话,有好几种方法,最容易想到的就是O(N^2)暴力枚举每一个start 和end点,不过,一般会超时,另外还有分治的方法,复杂度在O(n*logn),不过我没敲过(囧)、好吧,我昨天终于弄懂了那种O(n)的算法:因为最大的那一段肯定是以1~n中 的某一个点结束的,所以枚举他(枚举每一个end点),然后当枚举第k个 阅读全文
posted @ 2013-08-28 10:32 cnwsycf 阅读(226) 评论(0) 推荐(0)
摘要:0-1背包问题。求第K大的值。http://acm.hdu.edu.cn/showproblem.php?pid=2639这道题目第一次做的时候是一场自己挂的WEB-DIY中的一题,那时候是直接开了一个一维的dp[ j ]数组,用来记录获得价值j最大的体积,然后转化为简单的0-1背包,,思路感觉很简单,然后已提交,RE。伤了。后来才发现,最大价值可能要上亿。。。囧了。恩,后来用一位数组来记录。接着么。。。#include #include #include #include using namespace std; typedef long long LL; #define MIN... 阅读全文
posted @ 2013-07-27 09:18 cnwsycf 阅读(124) 评论(0) 推荐(0)
摘要:学长给的代码:可作参考void pack01(int a, int b) //0 - 1 背包 { int i; for(i = Sum; i >= a; i ++) dp[i] = maxz(dp[i-a] + b, dp[i]); } void packcmp(int a, int b) //完全背包 { int i ; for(i = a; i = Sum) { packcmp(w[i], g[i]); } else { int k = 1; int amount = num[i]; while( k < amount) ... 阅读全文
posted @ 2013-07-18 18:41 cnwsycf 阅读(283) 评论(0) 推荐(0)
摘要:刚刚学完简单的DP,现在在接触背包问题了,然后学长们推荐我看下这篇文章,所以转载过来了。 - -希望对大家有帮助吧。P01: 01背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。 阅读全文
posted @ 2013-07-18 10:31 cnwsycf 阅读(1179) 评论(0) 推荐(1)