上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 18 下一页
2013年6月19日

各大OJ题目归类

摘要: 各大OJ题目归类Posted on2012 年 8 月 8 日byadmin要时常听时常想时常进修,才是人生真正的生活生计体式格式。什么事也不抱,什么事也不学的人,没有生活生计的资格。—————————–最优化题目————————————-———————-动态规划SOJ1162 I-KeyboardSOJ2096 Maximum SubmatrixSOJ2111 littleken bgSOJ2505 The County FairSOJ2818 QQ音速SOJ2469 Exploring PyramidsSOJ1833 Base NumbersSOJ2009 Zeros and OnesSO 阅读全文
posted @ 2013-06-19 20:00 Primo... 阅读(732) 评论(0) 推荐(0) 编辑
2013年6月18日

poj3254 - Corn Fields(状态压缩dp)

摘要: 所谓的状态压缩就是把庞大的状态家族精简化。大多数都是用二进制表示状态的。状态:dp[i][j]表示第i行第j个状态所能达到的最大方案数目。状态转移:dp[i][j] += dp[i-1][k]代码如下:#include #include #define M 1000 #define N 15 #define MOD 100000000 bool a[N][N]; int m, n, dp[N][M], v[M]; void init() { int MAX = 1<<12, c = 0; for(int i = 0; i < MAX; i++) { ... 阅读全文
posted @ 2013-06-18 20:12 Primo... 阅读(136) 评论(0) 推荐(0) 编辑
2013年6月17日

uva10051 - Tower of Cubes( 简单动归)

摘要: 状态:d[i][j]表示第i个立方体第j个面朝上时塔的最大高度。状态转移:dp[i][j]= max{dp[k][l]]+1|a[i][j^1]==a[k][l]}; 输出路径用一个next数组记录下就可以了。代码如下:#include #include #define N 505 char ans[6][10] = {"front", "back", "left", "right", "top", "bottom"}; int n, a[N][6], next[N][6][ 阅读全文
posted @ 2013-06-17 20:42 Primo... 阅读(123) 评论(0) 推荐(0) 编辑
2013年6月14日

uva103 - Stacking Boxes(动归,记忆化搜索)

摘要: 利用条件建图,然后在图中找到最长路径,状态:dp[i]表示以i为起点的最长路径长度。状态转移:dp[i] = {max(dp[j]+1)|g[i][j] = 1}代码如下:#include #include #include #define M 15 #define N 35 int m, n, a[N][M], g[N][N], d[N]; int comp(const void *aa, const void *bb) { return *(int*)aa-*(int*)bb; } int judge(int s, int t) { for(int i = 0; i ... 阅读全文
posted @ 2013-06-14 21:54 Primo... 阅读(135) 评论(0) 推荐(0) 编辑
2013年6月13日

uva10534 - Wavio Sequence(动归,最长上升子序列)

摘要: 这道题目用到了最长上升子序列的o(nlogn)算法,建议没学过此类新算法的同学先做一下poj上的简单题目,学习一下求LIS的O(n^2)和O(nlogn)算法,资料见http://wenku.baidu.com/view/fe0deecea1c7aa00b52acb71.html这个题目让我们求波形序列,我们可以分成两个子问题,求1......i的上升序列长度len1和求n.....i上升序列长度len2,那么以i为中心的上升序列长度就是min(len1,len2)*2-1.思路:摘自百度文库。链接同上。。。算法2(nlogn):维护一个一维数组c,并且这个数组是动态扩展的,初始大小为1,c[ 阅读全文
posted @ 2013-06-13 17:50 Primo... 阅读(541) 评论(0) 推荐(0) 编辑

poj1609 - Tiling Up Blocks(动归)

摘要: 转自大神的话:刚开始想到的是用节点来进行dp。。。但是一看数量肯定是要超时的了。。。后来看到了 数据的范围比较小。。就想到了用数据来进行dp有的时候同样的方法在这个角度来看可能不行。。。但是换一个角度就海阔天空了。。。。状态:dp[i][j]表示用到长宽为i,j的砖所能达到的最大高度。状态转移:dp[i][j] = max(dp[i-1][j],dp[i][j-1])+w[i][j];这是我见过动归里比较偏向考察思路的题目,w[i][j]标识长宽为I,j的砖的个数。复杂度为o(m^2)(m= 100) .这个思路简直让复杂度发生了质变。代码如下:#include #include #inc.. 阅读全文
posted @ 2013-06-13 17:09 Primo... 阅读(128) 评论(0) 推荐(0) 编辑

poj1887 - Testing the CATCHER(动归)

摘要: 最长不上升子序列。把最长上升子序列的代码稍微改动一下即可详解请见:http://wenku.baidu.com/view/fe0deecea1c7aa00b52acb71.html#include #include #define N 10005 int n, a[N], c[N], dp[N]; int search(int l, int r, int x) { int mid; while(lc[1]) j = 1; else if(a[i]<c[size]) j = ++size; else j = search(1,s... 阅读全文
posted @ 2013-06-13 09:48 Primo... 阅读(147) 评论(0) 推荐(0) 编辑
2013年6月11日

poj2533 - Longest Ordered Subsequence(简单动规)

摘要: 状态:d[i]表示a[1.....i]的最长上升子序列状态转移:d[i] = max{d[j]+1|a[i]>a[j]}代码如下:#include #include #define N 1005 int n, a[N], d[N]; int main () { int max; while(~scanf("%d",&n)) { for(int i = 1; i a[j]&&ans #include #define N 1005 int n, a[N], c[N], dp[N]; int search(int l, int r, int x) { 阅读全文
posted @ 2013-06-11 21:44 Primo... 阅读(131) 评论(0) 推荐(0) 编辑

uva10069 - Distinct Subsequences(动规,大数)

摘要: 卡了我一天的题我还能说是水题吗。。。。开始的思路【半递推半搜索】虽然是不成熟的动规,但是我觉得至少还能过。看了人家比较成熟的思路却没有过。但最后还是用成熟的动规思路过的。代码挫在了写大数的地方。少了个等号,,,,状态:d[i][j]表示子串的前i-1个字符在母串前j-1个位置中出现的次数状态转移:(sub[i-1]==s[j-1])d[i][j] = d[i][j-1];(sub[i-1]!=s[j-1]) d[i][j] = d[i][j-1]+d[i-1][j-1];代码如下:#include #include #define M 10005 #define N 105 char s[.. 阅读全文
posted @ 2013-06-11 20:12 Primo... 阅读(124) 评论(0) 推荐(0) 编辑
2013年6月9日

uva825 - Walking on the Safe Side(动规)

摘要: 动规, 记忆化搜索。。。。思路不难状态:dp[i][j]表示点(I,j)到终点的最短路径数目;状态转移:dp[i][j] = dp[i+1][j]+dp[i][j+1];还有就是这道题的测试数据很操蛋,两个数之间不是规律的有一个空格,有可能有多个空格,我卡到这一点上wa了好几次。所以说读取的时候要用字符串读取。代码如下;#include #include #define M 105 #define N 105 int m, n, a[N][N], d[N][N]; char s[N]; int dp(int x, int y) { int &ans = d[x][y]; i... 阅读全文
posted @ 2013-06-09 22:53 Primo... 阅读(145) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 18 下一页