DP
Hearthougan
这个作者很懒,什么都没留下…
展开
-
Nyoj 10
转移方程:dp[i][j] = MAX(dp[i+1][j], dp[i-1][j], dp[i][j+1], dp[i][j-1]); #include <iostream>#include <cstring>using namespace std;const int MAXN = 110;int dir[4][2] = {{-1, 0}, {0,...原创 2014-03-13 12:23:51 · 622 阅读 · 0 评论 -
hdu 1003
#include <iostream>#include <cstring>using namespace std;const int MAXN = 100010;int main(){ int T, n; int Max; int dp[MAXN]; int kcase = 1; int num; int...原创 2014-03-06 11:12:11 · 744 阅读 · 0 评论 -
九度oj 1112 nyoj 79
nyoj #include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 25;int main(){ int h[MAXN], dp[MAXN]; int n, res; int T; ...原创 2014-03-12 15:51:29 · 933 阅读 · 0 评论 -
1513 hdu Palindrome 滚动数组+LCS
点击打开题目链接由于单纯地求LCS会使得运行超时,因此需要想办法减少开支;可以想到0-1背包问题是如何由二维减少到一维的,事实上,我们最后只需要计算的最后几个解,因此没有必要把每一步计算结果都储存起来,所以选用滚动数组来做;最后求的dp[n%2][n]lcs长度,n - dp[n%2][n]即为所求:#include<iostream>#include<cst...原创 2013-09-21 10:24:10 · 587 阅读 · 0 评论 -
hdu 2577 How to Type
题目源2577times[i][0] 表示输入字符i后,大写键是关闭状态;times[i][1]:表示输入字符i后大写键是开启状态;times[i][0]:是由times[i-1][0]和times[i-1][1]两种可能的状态决定的;同样times[i][1]:是由times[i-1][0]和times[i-1][1]两种可能的状态决定的;如果如入第i个字符是大写字母则:time...原创 2013-09-19 16:39:39 · 538 阅读 · 0 评论 -
状态压缩递推
【引例】 在 n*n(n≤20)的方格棋盘上放置n 个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。 【分析】 这个题目之所以是作为引例而不是例题,是因为它实在是个非常简单的组合学问题:我们一行一行放置,则第一行有n 种选择,第二行n-1,……,最后一行只有 1 种选择,根据乘法原理,答案就是n! 。这里既然以它作为状态压缩的引例,当然不会是为了介绍组合数学。我...转载 2014-03-15 20:32:49 · 973 阅读 · 0 评论 -
Nyoj 61
这个是双线程dp,第一次接触这种类型的题,参考别人的思想写的。参考 #include <iostream>#include <cstring>using namespace std;int MAX(int a, int b){ return a > b ? a : b;}int main(){ int T; i...原创 2014-03-15 02:14:39 · 951 阅读 · 1 评论 -
RMQ (Range Minimum/Maximum Query)算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN...转载 2014-03-16 16:58:27 · 678 阅读 · 0 评论 -
Nyoj 234 吃土豆
/**#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 510;int MAX(int a, int b){ return a > b ? a : b;}int main(){ int row...原创 2014-03-21 15:31:20 · 769 阅读 · 0 评论 -
Nyoj 791
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){ int V, i, j; int arr[10]; while(~scanf("%d", &V)) { int MI...原创 2014-03-31 21:52:51 · 899 阅读 · 0 评论 -
Nyoj 229
我感觉这道题很好!利用背包思想来做,用二分来逼近并找出答案! #include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 110;int Ap[MAXN];int Bp[MAXN];int dp[MAXN];/...原创 2014-03-20 00:10:40 · 1067 阅读 · 0 评论 -
Nyoj 708 Ones
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 10010;int dp[MAXN];int MIN(int a, int b){ return a < b ? a : b;}void ...原创 2014-03-28 21:35:57 · 893 阅读 · 0 评论 -
Nyoj 219
这里偷工减料了,用蔡勒公式直接代入了!蔡勒公式: W =(〔 [c/4] - 2c + y + [y/4] + [13 * (m+1) / 5] + d - 1 〕% 7 + 7)% 7;其中:c为年份的前两位数,y为年份的后两位数,m为月份,d为天数; 注:如果月份为1月份或者是二月份,则要算到上一年中去!输入输出要用scanf和printf否则会超时!由此可见,关键时...原创 2014-03-18 21:32:25 · 829 阅读 · 0 评论 -
Nyoj 712 探 寻 宝 藏
双线程dp,可以看成两个人同时从同一个地点出发沿着相同的方向出发,要保证保证两个人的线路不能相交!如果人1和人2在相同的行或者相同列,那么他们一定会在相同的列或者行,因此保证他们不在相同的行,就可以保证他们的线路不会相交!dp[k][i][j] 表示:走到第k步,机器人1走到第i行,机器人2走到第j行时所得到的最大的宝藏数!机器人1所在的列就表示成k-i,同理机器人2所在的列就为k-j,其中k...原创 2014-03-29 11:41:48 · 945 阅读 · 0 评论 -
Nyoj 613 免费馅饼
#include <stdio.h>#include <string.h>#define MAXN 100010int MAX(int a, int b, int c){ return ((a > b ? a : b) > c ? (a > b ? a : b) : c);}int main(){ int dp[...原创 2014-03-28 17:17:50 · 864 阅读 · 0 评论 -
Nyoj 195
看了好久,楞没看懂题目什么意思!一顿抓狂!题目的意思是从(0, 0)飞到(n, m)点处,最短距离是多少。其中有的是可以走方格的对角线(即是捷径),如果一个方格不能走对角线,则只能走方格的两条边。 如果可以走捷径由于从一个点(x1, y1)到另一个点(x2, y2),那么x2 > x1 && y2 > y1,即每一列,每一行至多只可以走一条捷径,那么可以先...原创 2014-03-17 22:49:19 · 1037 阅读 · 1 评论 -
Nyoj 81 炮兵阵地
解题报告:1.算法 : (1)首先,看到这个题目想到的是暴力搜索,无所谓深搜还是宽搜,都需要对所有的情况进行穷举,10*100 的格子,这样穷举的话基本上会超时。想到用贪心法,但是贪心法的结果是不正确的。 (2)于是想到动态规划,动态规划的重点是找状态转移方程,需要状态记录的数组 f(因为最终要求的是大炮个数,所以 f 的值记录当前状态的大炮个数)。从题目的数据中来看因为 m<1...原创 2014-03-17 12:35:50 · 1220 阅读 · 0 评论 -
Nyoj 456
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 12;int num[MAXN];int totalvalue;bool DFS(int sum){ if(sum == totalvalue)...原创 2014-03-27 20:08:06 · 775 阅读 · 0 评论 -
Nyoj 171 聪明的kk
代码一:输入完再处理 #include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 25;//int Graph[MAXN][MAXN];int dp[MAXN][MAXN];int MAX(int a, int...原创 2014-03-17 21:03:01 · 784 阅读 · 0 评论 -
NYOJ 110
哎,有个细节没注意到,一直折腾到现在! 编号为i的人能从所有人中胜出,必要条件是他能与自己“相遇”,即把环看成链,x点拆成两个在这条链的两端,中间的人全部被淘汰出局,x保持不败。这样,在连续几个人的链中,只须考虑头尾两个人能否胜利会师,中间的则不予考虑,从而少了一维状态表示量。设Meet_Matrix[i,j]记录i和j能否相遇,能相遇则为true,否则为false。Meet_Matri...原创 2014-03-16 14:12:59 · 628 阅读 · 0 评论 -
Nyoj 76
#include <iostream>#include <cstring>using namespace std;const int MAXN = 50;int main(){ int dp[MAXN]; int i; int n; int T; cin>>T; while(T--) { cin>>n; mem...原创 2014-03-15 12:45:29 · 762 阅读 · 0 评论 -
Dp+ hdu 龟兔赛跑 2059
/** 这是别人的思路,挺好,简洁,容易想通。 dp[i]表示:乌龟到达第i个加油站所需要的最短时间 dp[i] = min{dp[i],dp[j] + time}其中j < i and time为j到i点所需要的时间(含加油的时间) 把长度L的路程,看成N+2个加油站(算上起点和终点) */ #include <iostream> #include <cstr...原创 2013-08-26 21:23:05 · 504 阅读 · 0 评论