随笔分类 -  ACM_DP

摘要:题目链接:http://poj.org/problem?id=1837 题意是给定一个平衡杆,平衡杆的两端某些位置有钩子可以放置砝码,现在给定一些砝码,要你求出有多少种方法能使之保持平衡。方法是用平衡度的方法来进行状态转移,f[i][j]表示前i个物品的平衡度为j时的状态总数,则转移方程为f[i][j+c[k]*g[i]]+=f[i-1][j],显然f[m][0]就是最终答案,不过数组下标不能为负数,映射一下就可以了。 1 //STATUS:C++_AC_16MS_1632KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #in 阅读全文
posted @ 2013-01-20 00:56 zhsl 阅读(302) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2151 组合数做肯定超时,容易看出是DP。f[i][j]表示某个队的前j个题目做出i个题目的概率,则f[i][j]=f[i][j-1]*(1-num[j])+f[i-1][j-1]*num[j]。接下来就直接好求了,对每个队求出至少答对一个的概率,然后依次相乘就是满足题目的第一个条件,然后再减去每个队答对n-1个的概率的积就是最终概率了。 1 //STATUS:C++_AC_32MS_192KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<s 阅读全文
posted @ 2013-01-06 00:57 zhsl 阅读(208) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 题目大意是:给你一个数列,要你求最长的上升子序列,并且求最多有几个,且每个数只能在每个子序列中出现一次。对于第一问题很容易用DP解决,那么第二个问题,如果每个数可以出现多次的话,DP也很容易解决,但这里必须只能出现一次,否则的话就得判重,复杂度O(n3)。把问题简化一下,就是求长度为s的点不想交的路径有多少条,即每个点的容量为1(拆点),dp值相差为1的建立边,增加源汇点s、t,s向dp值为1的建立边,dp值最大的向t建立边,然后求最大流。 在网上看到这题贪心也可以搞,具体做法就是从... 阅读全文
posted @ 2012-12-11 09:42 zhsl 阅读(502) 评论(0) 推荐(0)