摘要: 题目题意异常恶心,难以理解...... 呵呵.....不过题意是 Lyush大神 花费一小时看明白后透露给笔者的, 到现在依然YM此大婶当中...... 先说说题目大意: 一颗完全二叉树,有 N ( n <= 1024,且必定为2的整数幂,意味着是一颗完全二叉树 ) 个叶子节点,每一个节点都含有一个长度为 LL ( L <= 1000 ) 的串 ( 串仅由大写字母构成), 现仅仅知道N个叶子节点串的组成.其他节点串不知道. 但我们知道,直接父节点相同的两个子节点,其对应位置不同则花费为1. 整棵树花费最小. 让你求,整棵树的最小花费, 以及根节点的可能串元素... 阅读全文
posted @ 2013-01-11 17:04 yefeng1627 阅读(339) 评论(1) 推荐(0) 编辑
摘要: 解决此类问题常见思路: 为求以 A1, A2, ... , AK 为前K项的所有栏杆字典排序第K小的序列. 这里给出其他牛人的介绍先抛开此题,用最简单的全排列问题来说明这种方法。如1,2,3,4的全排列,共有4!种,求第10个的排列是?先试首位是1,后234有3!=6种<10,说明1偏小,转化成以2开头的第(10-6=4)个排列,而3!=6 >= 4,说明首位恰是2。第二位先试1(1没用过),后面2!=2个<4,1偏小,换成3(2用过了)为第二位,总编号也再减去2!,剩下2了。而此时2!>=2,说明第二位恰好是3。第三位先试1,但后面1!<2,因此改用4。末位则是 阅读全文
posted @ 2013-01-10 18:48 yefeng1627 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 状态 dp[i][j] 表示 第i根柱子,高度为j的最小花费 转移方程 dp( i , j ) = Min { dp( i-1, k ) + | k - j | * C + ( j-a[i] )*( j-a[i]) } 如果我们 枚举 j 和 k, 因为 都小于 100, 时间复杂度也有 O( 10^9 ), 1000 ms也不够. 我们可以把绝对值拆分开来: 当 j >= k 时: dp( i, j ) = Min{ dp( i-1, k ) - k*C + j*c + ( j-a[i])^2 } 当 j <= k 时: dp( i, j ) = ... 阅读全文
posted @ 2013-01-09 18:55 yefeng1627 阅读(214) 评论(0) 推荐(1) 编辑
摘要: 将题目转换题意, 有一个M列的墙, 我们需要 使用 1*2 的小矩形 砌成N层高, 有多少不同的方案数量. 因为只有1*2的砖头, 且只有竖立或者横着放. 那么我们规定 竖立放置的砖头属于 较高的一层, 且 当前点放置砖头则为1,否则为0 那么我们可以得出结论: 对于 I 层 状态 X , 若当前位置为0,则下层必定为1. 则意味着下层必定包含 t = (~X)& Mask 对于 I+1 层 状态 Y, 除了包含 状态 t 之外, 剩下标记为1的 必须两两成对.才可符合状态. 注意 t = (~X)& Mask 这里要记得还要与 总集合MASK相与. 把状态限定在MASK... 阅读全文
posted @ 2013-01-09 12:07 yefeng1627 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 设定状态 DP( i, j ) 表示从第一层到 i 层 j 房间 最小花费. 则状态转移方程为 DP( i, j ) = Max { DP( i-1,j), DP( i, j-1 ), DP( i, j+1 ) } + a( i , j ) 因为 对于当前层的处理, 左右之间可以拆分开来处理, 再设定一个 d( i, j ) 记忆是由哪个位置走到当前位置的. 然后通过递归求路径即可解题代码View Code #include<stdio.h>#include<string.h>#include<stdlib.h>typedef long long LL;#d 阅读全文
posted @ 2013-01-08 22:12 yefeng1627 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 当总数量 N 为奇数的时候, 因为N为奇数,N+1变成1,同样为奇数. 则意味着奇偶位置可以相互转换. 但是当N为偶数的时候,因为N为偶数,N+1变成1,转换成了奇数. 奇数位置,和偶数位置不相关. 因为我们的置换规则是 奇数位置和奇数位置对换, 偶数位置和偶数位置对换. 那么当N为奇数时,可以转换成任意形态. 但是当N为偶数时,仅仅当奇数位置上的黑点数量与偶数上的黑点数量相差小于等于1的时候,才可转换成符合条件的情况.解题代码View Code #include<stdio.h>#include<string.h>#include<stdlib.h>int 阅读全文
posted @ 2013-01-08 17:52 yefeng1627 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 定义结构体 struct Dir { vector< Dir > dir; vector< string > file; }; 通过递归处理, 和输出 就很方便了。 要注意,当出现子目录时,递归下去处理,回朔后再将其加入到父目录的vector中,不然没有保存到之后的信息。解题代码:View Code #include<algorithm>#include<iostream>#include<vector>#include<string>#include<stdio.h>using namespace std;s 阅读全文
posted @ 2013-01-08 17:48 yefeng1627 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 保存下当前点能走的最大步长,当下次从其他点走到该点,则能够立即判定步长. 因为起点不一定, 以及 走一次不一定能走完所有位置. 但是,每次从最高点走,总是好的.能够走的更多. 每次选择没有走过的记忆化搜索.就OK了. 注意,a[i][j]可以取0, 所以dp应该初始化小于0解题代码#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>#include<iostream>#include<algorithm>using namespace s 阅读全文
posted @ 2013-01-07 20:18 yefeng1627 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 因为 N = 100, 最大子矩阵行与行之间相邻,我们可以 O(N*N)内枚举子矩阵由哪些行组成,然后把多行合并成一行后,当一维数组求连续子序列和。时间复杂度接近 O(N*N*N) = 10^6解题代码:#include<stdio.h>#include<stdlib.h>#include<string.h>const int inf = 0x3fffffff;int a[110][110], b[110];int dp[110], ans, n;int main(){ while( scanf("%d", &n) != EOF) 阅读全文
posted @ 2013-01-07 20:14 yefeng1627 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 题目大意 一颗含有N个顶点的树,节点间有权值, 节点分为黑点和白点.问题是 找一条黑点数量不超过K个的最大路径.解题思路: 因为路径只有 过根节点以及不过根节点, 所以我们可以通过找寻树重心分治下去. 问题就退化成了处理: 对于当前以 x 为根的树, 其最大路径 对于X的所有直接子节点, 定义函数 G( I, J ) 表示子节点 I为根的树不超过J个黑点的最大路径. 定义函数 dep( i ) 表示以 i为根的树,最多黑点数量. 则结果为 ans = MAX{ G(u,L1) + G(v,L2) } ( u != v, 且 L1+L2 <= K - (当前根节点... 阅读全文
posted @ 2013-01-07 17:09 yefeng1627 阅读(1191) 评论(2) 推荐(0) 编辑

Launch CodeCogs Equation Editor