上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 43 下一页
摘要: http://wikioi.com/problem/2833/拓扑排序,居然1A,哈哈。#include #include #include #include #include #include #define MAX(a, b) a>b?a:b#define LEN 105using namespace std; int main(){ int n, m; scanf("%d%d", &n, &m); vector > graph(n+1); vector indegree(n+1); vector visit(n+1); int ans = 阅读全文
posted @ 2013-10-24 22:23 阿牧遥 阅读(204) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1077/Floyd算法。精华是三层循环,if (dist(i,k) + dist(k,j) 0,通过分析可以得到:中间顶点不超过k的i到j的最短路径有两种可能:该路径含或不含中间顶点k。状态转移方程:c[i,j,k]=min{c[i,j,k-1], c[i,k,k-1]+c[k,j,k-1]},k>0。所以我们平时看到的Floyd算法就是该动态规划的精简版。#include #include #include #include #define MAX(a, b) a>b?a:b#define LEN 105using namespac 阅读全文
posted @ 2013-10-24 22:03 阿牧遥 阅读(226) 评论(0) 推荐(0)
摘要: 错误半天还是因为并查集写错了。写错的地方是合并X和Y的时候,应该把FX挂到FY上去,而不是把X挂到Y上或FY上去,因为FX和FY下面有一树别的节点。http://www.nocow.cn/index.php/%E5%B9%B6%E6%9F%A5%E9%9B%86加强印象,仔细看图:本题的思路有两种,一是求最大值最小,而已二分+BFS来做,但效率较低。更好的做法是贪心+并查集。先按照怨念排序,然后从大到小判断是否有冲突。判断冲突的时候用了个巧妙的方法,就是A和B不能放在一组,那么设A的补集为!A,B的补集!B,那么merge(A, !B) 且merge(B, !A),这样当有A不能和B在一起,C 阅读全文
posted @ 2013-10-23 23:20 阿牧遥 阅读(251) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1039/划分型DP。最终的思路是,F[i][j]表示i分成j份,如果分出来的有1,那么去掉1,就是F[i-1][j-1];如果没有1,那就都减1,就是F[i-j][j](注意此时i>=2j)。那么F[i][j]=F[i-1][j-1]+F[i-j][j]详细些的话,以sample为例:7=5+1+1;7=2+4+1;7=3+3+1;7=2+2+3;我们可以把所有数的拆分分成2种情况,有1和没有1的2种那么有1的部分全部减去1,变成6=5+1;6=2+4;6=3+3;这就是6的所有划分成2部分的划分了。没有1的,我们把没有1的所有因子全 阅读全文
posted @ 2013-10-22 22:19 阿牧遥 阅读(312) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1154/这是石子归并的加强版,基本就是分治法的DP。但是有了个环,因为任何一个位置都可开始,所以就建立2*N的数组,然后对可能的区间遍历一次,就是O(n^3)的复杂度。中间错误的地方有:# 把dp(i,j)错误写成F[i][j]# k不能等于i,也不能等于j# 把A[i]*A[k]*A[j]错写成i*k*j#include #include #include #include #define MAX(a, b) a>b?a:b#define LEN 105using namespace std; int A[LEN*2];int F[ 阅读全文
posted @ 2013-10-21 23:34 阿牧遥 阅读(188) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/3027/# 有个小错误调了半天,最终发现sort(line, line+N)错了,后面那个是exclusive的,所以要line+N+1。# 按照右端点从小到大排序。原因是循环结构中是i从1到n, i比较小的时候尽可能选右端点比较小的,这样才可以为后面的线段留下更大的空间。# f[i]表示:算前i条线段时,选上第i条线段,能获得的最大价值。f[i]=max{f[j]}+c[i] (if 不重合)#include #include #include #include #define MAX(a, b) a>b?a:b#define LE 阅读全文
posted @ 2013-10-21 20:55 阿牧遥 阅读(258) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1068/多重背包。边界f[0,0,0,0]=a[1](初始时没有用任何卡片,获得棋盘第一格的分数)DP方程:f[i,j,k,l]=max(f[i-1,j,k,l],f[i,j-1,k,l],f[i,j,k-1,l],f[i,j,k,l-1])+a[i+j*2+k*3+l*4+1 /*此处+1是必须的,因为初始一格没有用卡片*/ ]使用了备忘录+递归。#include #include #define MAX(a, b) a>b?a:busing namespace std;int N;int M;int f[45][45][45][4 阅读全文
posted @ 2013-10-21 12:55 阿牧遥 阅读(245) 评论(0) 推荐(0)
摘要: 经典的DFS剪枝,值得回味。多个剪枝:1.木棍长度L必须整除总长sum;2.木棍总长L大于等于小木棍最长那个,小于等于sum;3.小木棍长度排序,从大的开始枚举,因为大的约束多,所以能接近根处剪枝;4.小木棍排序过,同样长度的相邻,如果有个同样长度的不行,那么之后同样长度的也不行;5.最重要有效的剪枝:假设木棍长度是L,那么现在是一部分L拼完了,一部分L没拼完如下(\分割):L, L, L, L \ L, L, L那么在拼\后面第一个L时,A[j]不行,那么由于后面三个L都一样长,是等效的,所以A[j]对后面三个L都不行,就可以直接返回false了。那么如果这是\后面是L',也就是已经 阅读全文
posted @ 2013-10-18 23:36 阿牧遥 阅读(229) 评论(0) 推荐(0)
摘要: 在DP的时候记录前驱节点的值到数组,然后DFS该数组构造结果。做完这道题,有种“宋元明清后,王朝至此完”的赶脚。import java.util.*;public class Solution { public ArrayList wordBreak(String s, Set dict) {... 阅读全文
posted @ 2013-10-16 23:00 阿牧遥 阅读(1187) 评论(0) 推荐(0)
摘要: LeetCode越来越大姨妈了,Submit上去又卡住了,先假设通过了吧。这道题拿到思考先是递归,然后有重复子状态,显然是DP。用f(i,j)表示字符串S从i到j的子串是否可分割,则有:f(0,n) = f(0,i) && f(i,n)。但是如果自底向上求的话会计算很多不需要的,比如leet已经在字 阅读全文
posted @ 2013-10-16 00:19 阿牧遥 阅读(3363) 评论(2) 推荐(1)
上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 43 下一页