摘要:
题意:给定一个序列,求其最短非子序列的长度。分析:我们把序列划分为若干个区间,每个区间都包含(1~k)这些数字。我们使划分的区间尽量多,方法就是从左到右一旦满足了包含所有字符,则立即停止该区间,从下一位开始一个新的区间。答案就是划分的区间数+1。下面我们简单证明一下:对于一个有x个区间的序列,一定包含了所有长度为x的序列。因为,对于任意一个长度为x的序列,只需要依次在x个区间中取出其对应位的元素即可组成。对于一个最多有x个区间的序列,一定不能构成所有的长度为x+1的序列。因为只需要取每个区间的最后一位,构成一个长度为x的序列,在最后加上一个刨除前x个区间后的剩余部分所不具有的字符即可。这个长度 阅读全文
posted @ 2011-06-08 17:45
undefined2024
阅读(631)
评论(0)
推荐(0)
摘要:
简单题View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>using namespace std;#define maxn 25struct XPoint{ int x, y;} a;bool map[maxn][maxn], vis[maxn][maxn];int n, m, ans;int dir[4][2] ={{ 0, 1 },{ 0, -1 },{ 1, 0 },{ -1, 0 } 阅读全文
posted @ 2011-06-08 16:38
undefined2024
阅读(585)
评论(0)
推荐(0)
摘要:
简单题View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define maxn 45int f[maxn];int main(){ //freopen("t.txt", "r", stdin); f[1] = 2; f[2] = 3; for (int i = 3; i < maxn; i++) f[i] = f[i - 1] + f[i - 2] 阅读全文
posted @ 2011-06-08 16:24
undefined2024
阅读(215)
评论(0)
推荐(0)
摘要:
树状dp,不简单。题意:给出一棵有根树,问最少切断几条边可以得到有i个结点的子树(连通分支)。采用左儿子右兄弟的存储方式,dp用两个数组:f[i][j]表示以i为根的子树,形成以本子树根结点为根(不包含本子树以外结点),共j个结点的子树所需的最小消耗。这里并没有计算切断i与其父亲连接的边的消耗。g[i][j]表示以i节点的父亲为根的,i结点以及i的父亲的子结点链中的i以后的结点做根的子树,构成共j个结点的以i的父亲为根(不包含本子树以外结点)的子树所需的最小消耗(i的兄弟们在形成子树时与i的父亲相连,即计算消耗时无需切断与i父亲的连接,但j个结点中不包含i的父亲)有状态转移方程:g[root] 阅读全文
posted @ 2011-06-08 16:12
undefined2024
阅读(1458)
评论(0)
推荐(0)
摘要:
简单题View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;long long n, m;long long com(long long n, long long r){ if (n - r < r) r = n - r; long long i, j, s = 1; for (i = 0, j = 1; i < r; i++) { s *= (n - i); for (; j < 阅读全文
posted @ 2011-06-08 09:27
undefined2024
阅读(229)
评论(0)
推荐(0)