
Dynamic Programming
文章平均质量分 71
huangshenno1
这个作者很懒,什么都没留下…
展开
-
POJ1946 Cow Cycling
dp题,用dp[i][j][k]表示 剩下i头牛 头牛的体力为j 已经跑了k圈 所用的最短时间尽量把头牛的体力用完后dropout再换牛,否则会多消耗总体力;头牛没有体力之后就可以直接dropout换牛,接上来的牛的体力等于e-k#include int Min(int a,int b){return a<b?a:b;}const int INF = 0x3f3f3f3f;i原创 2013-03-11 12:13:39 · 851 阅读 · 0 评论 -
HDU4089 Activation
概率DP状态转移方程:dp[i][1] = p1*dp[i][1] + dp[i][i]*p2 + p4dp[i][j] = p1*dp[i][j] + dp[i][j-1]*p2 + dp[i-1][j-1]*p3+p4 (jdp[i][j] = p1*dp[i][j] + dp[i][j-1]*p2 + dp[i-1][j-1]*p3 (j>k)一层一层的处理,原创 2013-10-07 16:22:44 · 534 阅读 · 0 评论 -
ZOJ3582 Back to the Past
概率DP用dp[i][j]表示当前两边分别有i和j个亮的,此时到目标的期望。有:dp[i][j] = 0 (i >= m && j >= m)dp[i][j] = 1 + sigma(dp[i+a][j+b] * p) ,a>=0 && b>=0,p根据组合数算一下就行了,带环移项消一下也就行了幸好这题对精度要求不太高= =#include #include #原创 2013-10-05 00:05:23 · 548 阅读 · 0 评论 -
HDU3716 Jenga
其实是水题啊,不过就是没人做= =概率+记忆化搜索在叠叠乐基础规则之上,已知叠叠乐中每一层只有以上四种状态是稳定的,并且在总高度为n时,积木移动成功的概率为p = b - n * d。题意就是求在最优策略下,A的胜率。(具体一点请自行读题)如图,只有A和C两个状态是有后继状态的,所以说我们只需要记录这两个状态的个数就行了。(所以题目中的概率才用b和d表示么=原创 2013-10-02 11:49:49 · 807 阅读 · 0 评论 -
HDU4745 Two Rabbits
把模型抽象出来,其实就是在一个环中找一个最长的子环,并且这个子环是轴对称的。从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的。倍长原序列,在新序列中求所有区间的最长回文子序列长度。答案就等于所有长度为n的区间中最长回文的长度 和 所有长度为n-1的区间中最长回文的长度+1(在轴上的两点可不同) 中最大的那个。原创 2013-09-15 22:05:35 · 1253 阅读 · 0 评论 -
SRM588 KeyDungeonDiv1
任意门:http://community.topcoder.com/stat?c=problem_statement&pm=12714很典型的状压DP。如果已经通过的是门A和门B的话,不论先过A还是先过B,用掉的钥匙数和得到的钥匙数是一样的。但是请注意:使用的白钥匙可能不一样。换而言之,用于开红色门的白钥匙数可能不一样(同理,用于开绿门的白钥匙数也不一样,只需统计一个就可以了)原创 2013-08-13 11:22:17 · 822 阅读 · 0 评论 -
CF11D A Simple Task
http://codeforces.com/problemset/problem/11/D一看以为是图论吓尿了,其实是状态压缩DP。感谢frog神提供思路。dp[i][j]表示当前链包含结点k(iff 1假设链i的起点是其最低位1的结点,在找到起点之后判断末尾是否能与起点相连。若能,再判断是不是自环,两点环。最后,由于延伸过程是双向的,即对于一个环来说,顺时针和逆时针都被算原创 2013-07-16 21:56:40 · 628 阅读 · 0 评论 -
CF17C Balance
定义压缩串为把某字符串中所有连续相同的字母压缩成一个所形成的的串。如aabbaaaabcc -> ababc如果原串是A,变形后的串为B,那么A的压缩串A‘和B的压缩串B',存在这样的关系:B'一定是A’的字串。预处理统计A中每个字符后面(包括自身,因为可以不断重复自己)最近的'a''b''c'分别在哪个位置,用next[i][0-2]记录。从1-n生成新串B,用dp[i][a][b]原创 2013-07-22 21:40:21 · 814 阅读 · 0 评论 -
POJ1185 炮兵阵地
这道题用DP做有两种解法,一是三进制表示,我认为这种应该是比较理想的,但是比较难写。另一种就是二进制,不过需要注意的是,每一行的状态最多只有60种,所以60*60*60*100加上一些剪枝勉强可以过= =用dp[i][j][k]表示第i行,上一行的状态是j,这一行的状态是k。则转移到下一行时有,dp[i+1][k][l]=max(dp[i+1][k][l], dp[i][j][k]+pop原创 2013-07-20 18:58:21 · 541 阅读 · 0 评论 -
HDU3068 最长回文
O(n)求最长回文串用辅助数组p记录以每个字符为中心得最长回文串的信息。在字符间插入'#',可以奇偶两种情况同时考虑。具体算法部分参考#include #include #include #include #include #include #include #include #include #include #include #include原创 2013-07-20 18:15:42 · 483 阅读 · 0 评论 -
POJ2411 Mondriaan's Dream
用1*2的小长方形铺满整个n*m的大长方形吧!问有多少种方案。用dp[i][j]表示第i行(从1开始计数)之前的所有行均已铺满,第i行目前铺的形状是j(j的二进制表示,比如01011001)。填满第i行有三种方法,用横的小长方形和用竖的小长方形,或者兼用之。枚举所有可以填横的小长方形的方法,设此时改行形状为xx,若某一位置不够(为0),则可用竖的小长方形填补,形成的新一行的形状为((1原创 2013-07-20 14:51:06 · 524 阅读 · 0 评论 -
POJ3590 The shuffle Problem
http://poj.org/problem?id=3590题目的意思就是求最大的置换周期。很容易知道,整个序列的置换周期等于其中所有小循环的阶的最小公倍数,DP求之。#include #include const int maxn = 110;int T,n;int dp[maxn][maxn],ds[maxn][maxn],ans[maxn],anss[max原创 2013-07-17 14:04:29 · 615 阅读 · 0 评论 -
SOJ3605 The sum of prime number
好吧,其实是水题,但是我觉得其中还有一定的思维难度的。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using n原创 2013-05-28 15:15:59 · 513 阅读 · 0 评论 -
POJ3124 The Bookcase
这是一道比较难想到的DP问题,先按高度从大到小排序,不妨设第一本书是放在第一层,且它在第一层是最高的,下面讨论其他的书。dp[i][j]表示第2层书架厚度为i,第3层书架厚度为j时二三两层的高度和。则有状态转移方程:if (j==book[i].t && dp[j][k]>dp[0][k]+book[i].h) dp[j][k]=dp[0][k]+book[i].h;i原创 2013-04-11 21:39:51 · 522 阅读 · 0 评论 -
POJ1952 BUY LOW, BUY LOWER
题意很简单,就是求最长降序子序列的长度和其个数且不能重复。用dp[i]表示以第i个数为尾的最长子序列的长度,t[i]表示第i个数为尾的最长子序列的个数,特别的,当a[i]与a[j](i>j)相同且之前的序列也重复时(具体就是此时dp[i]==1),强制令t[i]=0,可用数学归纳法证明。不想多说了,代码见下。#include int n,len,cnt,a[5005];i原创 2013-03-13 12:09:32 · 540 阅读 · 0 评论 -
HDU4035 Maze
神一般的概率DP基本的状态转移方程:dp[i] = k[i]*dp[1] + e[i]*0 + (1-k[i]-e[i])/d[i]* ( ∑( dp[j]+1 ); (i, j相连)把原图看成一棵树,可以把每一项的状态转移方程化简成只与其父节点有关。然后写出来的话会比较复杂= =我说的可能不够清楚,详见kuangbin大神的http://www.cnblogs原创 2013-10-08 23:02:03 · 520 阅读 · 0 评论