01 2013 档案
摘要:题义:规定这样的一个序列,只由A,B,C,D四种字符组成,并且A和C的个数都为偶数个,现在问一个长度为N的序列,有多少种构成方式能够使长度为N的串满足这些要求。解法:对于任意长度的一个串,我们设定三个状态f[i][0]表示满足要求的合法串, f[i][1]表示A和C只有一个字符不满足的非法串, f[i][2]表示A和C均不满足的非法串。那么就有递推关系 f[i][0] = 2*f[i-1][0] + f[i-1][1], f[i][1] = 2*(f[i-1][0] + f[i-1][1] + f[i-1][2]), f[i][2] = f[i-1][1] + 2*f[i-1][2].根据这个
阅读全文
摘要:前言在C++PrimerPlus和C++Primer这两本书之间选择了很久,最后还是敲定了前者,原因是许多人反应前者更基础,有的人推荐有过C语言的基础的话适合后者.而我觉得自己在编程方面仅仅局限于解决竞赛中的题目,而并没有一个软件设计的思想在里面,这在平时做的一些课程设计中自己也能够感受到,两者不能说没有关系,许多解题的想法和编程技巧能够很好的应用到项目中来,但是自我感觉语言中的很大一部分还是被忽略了,因为那些在解题中几乎是用不到的.因此选择了这本C++PrimerPlus,能够让我从0基础来认识C++,因此也要花费更多的时间来读这一本书.第一章:预备知识不得不说,预备知识和书中前言所说的不需
阅读全文
摘要:刚刚过去的这个学期真的很快,还记得暑假呆在学校里面天天做题,紧接着就是省赛了,后面又是实习的半个月,软考花去一个星期,C++课程设计由于答应和两个女生一组,所以也就赶啊赶.再后面就是期末复习,之后又和宿舍的人玩了几天英雄联盟.后面去实验室呆了近20天.1月19号回到衡阳,正式结束了上一个学期.对上学期的总结就是简单,忙碌,松懈,警惕,遗憾.个中体味也许只有自己能够明白.最后在实验室的20天似乎又找到了什么,意识到如果不够勤奋的话,很快又会变得平凡,之后便过着以后自己不想过着的生活.于是付出时间学习这一想法久久在心中挥散不去.每个寒假都说要做点什么,但是最后总是不了了之,原因很简单,没有一个明确
阅读全文
摘要:这题一个很巧妙的操作就是对一个给定的区间同意将下界拿出来, 然后转化为多重背包问题. 使用二进制优化.代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>#define ER 0x80808080using namespace std;/*解题:给定一个Multi数组, 一个Pairs数组, 要求出最好的Table的数组. 其中应满足这个几 个要求,
阅读全文
摘要:这题和POJ1947类似, 同样是树形DP, 就是因为按照上题的思路写, 导致写的是非常的蛋疼. 调了几小时还是无果. 时候证明还是对状态的意义理解的不透彻.设dp[x][0][j]表示以节点x为根至多走j步并且返回x处所能够得到的最多苹果. dp[x][1][j]表示以节点x为根至多走j步不需要返回x处所能够得到的最多苹果.那么就可以得到动态转移方程(此时的dp[x][..][j]还没有完善, 需要后期处理一下):dp[x][0][j] = max( dp'[x][0][j-m] + dp[v][0][m] ); 0<=m<=j 其中dp'表示计算到上一个孩子节点
阅读全文
摘要:这题在yefeng1627的淫威下迅速屈服. 由刚开始的一个较动态方程便很好的解决了组合问题, 再加之进一步分析, 将本来应该要的辅助状态删除, 剩下的就是一个非常优美的动态规划方程了.详见代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define INF 0x3f3f3f3fusing namespace std;/*题意:给定一棵树, 现在要求从这棵树中分割出P个节点的子树, 问最少要破
阅读全文
摘要:这题有两种解法, 一种是通过动态规划弥补一个不太成熟的贪心思路, 使得最后的结果正确. 另一种方法是构造一个更好的贪心策略.动态规划依托的结论: 每次给齐王最强的马匹配一匹田忌的马, 那么这匹马不是田忌最强的马就是最弱的马, 这一个不完善的贪心策略. 所以动态规划佐之.#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>using namespace std;/*解法:开设状态dp[i][j]表示田忌出了
阅读全文
摘要:这题题意在代码中有解释, 求的最优值初看不太好理解. 求的是给定一个决策下的找到房子的最优期望值. 那么这题其实要做的就是一件事那就是给所有的分叉口的选择拍一个次序出来.根据这个次序我们就能够给出这只蜗牛在碰到有所情况下的唯一的一条爬行路线. 题目就是当我们安排好这样的这个次序后, 假设房子在各个叶子节点时, 需要走的路径总长最小. 这里的每一棵子树, 在枚举的过程中总是充当着不同的角色, 当枚举到的房子在自己的子树中时, 其要考虑能够安排最快的路径让蜗牛找到. 当没有在自己的子树时又不想让其放在前面让蜗牛白忙活一场. 所以综合一看, 貌似是一个很复杂的问题. 但是这题就是在如何安排子节点访问
阅读全文
摘要:由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态数,让状态能够表示是从1还是从0转移过来的.(这题有个解法是采用多进制的状态压缩). 网上瞄了别人的一眼解题报告. 瞬间顿悟,竟然三层之间发生关系,那么就直接把连续的两层记录起来,虽然说空间上不及多进制优美. 但是却能够去描述这些个问题.代码如下:#include <cstdio>#include <cstring>#include <cstdlib>#incl
阅读全文
摘要:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#define MOD 100000000using namespace std;/*题意:给定一个矩阵,这个矩阵表示了一块土地,给定的数据只有0,1, 表示土地肥沃与否. 其中0代表不肥沃,1代表肥沃. 不肥沃的地方是不能够种植玉米的,还有一个约束就是 不能够在相邻的1种植玉米. 现在问一共有多少种种植方式. 解法:明显的状态压缩题,先dfs出一行的非
阅读全文
摘要:这题要考虑锤子移动到网格外部的情况,否则WA,处理的方式就是行和列同时增加5(最大距离).详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>using namespace std;/*题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现 出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能 够移动锤子,移动的两点之间的距离不能超过
阅读全文
摘要:详见代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <iostream>#define INF 0x3f3f3f3f#define MAXN 1000005using namespace std;/*题意:给定N个柱子,现在要在这N个柱子之间摇摆,直至到达最右端的那一个柱子,问最少要 摇摆多少次. 摇摆的时机是在开始的时候或者是从某一点摇摆到某个对称的点时,保 证所有的柱
阅读全文
摘要:详见代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;int N, M, dp[505][505];int row[505][505], col[505][505];/*题意:给定一个矩阵,矩阵中的每一个点都有两种矿产,A矿产只能够运送到上面去,B矿产只能 够运送到左边去,现在要在每个点都设置一个传送带传送带共有两种,一种是往上,一种 是往左,每个格子只能够
阅读全文
摘要:题意:给定一个矩形,现在给出这个矩形中某些点存在柿子树,问在一个长和宽限定的子矩形内最多有多少个柿子树.解法:由于此题中数据量不大.直接树状数组统计然后暴力.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int N, R, C, dx, dy;int tr[105][105];inline int lowbit(int x) { return x &
阅读全文
摘要:前面自己写的动态方程转移出现了问题,还是没有考虑周全.AC代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;/*题意:给定了一个字符串,问这个字符串,这个字符串是由a,b,c,...,a+N-1的字符集组成的 现在问使用使得该串成为一个回文串的最少花费是多少. 花费的定义如下: 对于每一个字符,给出添加这个字符和删除这个字符分别需要花费多少. 添加和删除 可
阅读全文
摘要:插入排序: 时间复杂度O(n^2), 辅助存储空间O(1), 稳定排序插入排序#include <stdio.h>#include <stdlib.h>int A[10000];void insertsort(int a[], int p, int r) { int i, j; for (i = 2; i <= r; ++i) { a[0] = a[i]; // 作为元素的备份和起到监视哨的作用 for (j = i-1; a[0] < a[j]; --j) { a[j+1] = a[j]; } a...
阅读全文
摘要:搜索+剪枝#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#define MAXN 5005using namespace std;/*题意: 给定一个行数和列数固定的网格,再给定若干个点,这些点是使用矩形上网格线交叉点的 坐标来唯一确定的R行C列的网格,左上角的坐标为(1,1)右下角的坐标为(R,C),问给定的 这些点能够组成最长可能路径是多长. 路径的定义的如下的:由若干连续且间隔相等的 点组成,
阅读全文
摘要:Problem A:(HDU 1040)题意:给定数据组数T,然后对于每一组数据,首先输入一个N,表示该组共有N个数,后面跟N个数字,要求输出.插入排序#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXN 1005// MAXN要定义的稍微大一点,防止数组越界 /*该题数据较小,所以一般的排序的算法应该都可以AC此题 */int N, seq[MAXN];void insertsort(int m, int n) { // 带了个区间 for (int i = m+1; i
阅读全文
摘要:这题当M=N=0的时候要输出1.000 刚写的时候默认从第二次开始取了.详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>using namespace std;/*题意:从一个拥有无限多的盒子中拿出不同颜色的糖果,拿出任何一种颜色的概率都是1/C 每次拿出来的糖果都放在桌子上,如果有相同颜色的糖果,就把这两颗糖果吃掉.问 拿了N次后,桌子上面剩余的糖果数量为M的概率是多大 解法:设状态dp[
阅读全文
摘要:该题解题过程非常优美,通过位操作来维护一个可选字符集合.并且完成求并集和交集.详见代码:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>#include <iostream>using namespace std;/*花了大半个小时看懂了这题题意:给定N个字符串,N为2的幂,每个字符串长度为L,这N个字符串是一棵完全二叉树的叶子节点,现在问树的内部在同样要填入长度为L的字符串的情况下,最少的花费是多少,根节点是什么. 花费是这样计算的:一
阅读全文
摘要:优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->成员选择(指针)对象指针->成员名2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式++自增运算符++变量名/变量名++单目运算符--自减运算符--变量名/变量名--单目运算符*取值运算符*指针变量单目运算符&取地址运算符&变量名单目运算符!逻辑非运算符!表达式单目运算符~按位取反运算符~表达式单目运算符sizeof长度运算符sizeof(表达式)3/除表达式/表达式左到右双目运算符*乘表
阅读全文
摘要:简介 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。用途 倒排文件(倒排索引),索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。原理 Lucene倒排索引原理 Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。...
阅读全文
摘要:详见代码:#include <cstring>#include <cstdio>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>using namespace std;int N, sum[10][10]; // sum[i][j] 表示以i,j为右下角的矩阵的和int dp[15][10][10][10][10];int tot[10][10][10][10]; // tot[m][n][i][j]记录了左上角为m, n右下
阅读全文
摘要:该题说明了状态开设的意义一样,但是从哪个方向去理解推倒状态的转移对解题非常关键.该题扣住是否所有的盘子中有空盘子,就得到了一个非常简单且优美的方程.如果从当前盘子的放置状态或者是当前苹果的放置状态来求解状态转移方程就不能写出来.这和题意中的相同盘子,相同苹果有很大的关系.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int N, M, dp[15][
阅读全文
摘要:该题题意很简单,题目中定义了丑数的概念,即这个数只有2,3,5这几个因子,现在要我们输出前1500个丑数的任意一个.前面没想到好的方法,直接想着打表了,前面700个能够在线跑出来,后面的就打了个表.#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;bool is(int x) { while (x % 2 == 0) x /= 2; while (x % 3 ==
阅读全文
摘要:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;/*该题给定一个N,那么在有1.2.3...N个数字的情况下,这些数字高低交替进行排列把所有符合情况的进行一个字典序排列,问第C个排列是一个怎样的排列up[i][j]代表长度为i,第一位为j且后面需跟着一个上升数字的方案总数dn[i][j]代表长度为i,第一位为j且后面需跟着一个下降数字的方案总数根据我们所定义的状态,我们能够得到一个状态的转移关系(用来状态转移来
阅读全文
摘要:这题的状态推倒极富想象力,原来写过的代码又忘了如何去写了......题意:其实就和以前做过的一道我要长高一模一样,给定N个数字,现在要求连续的两个数字之差的绝对值乘以C最小,每个数字可以变大,变大所带来的开销为变量的平方. 状态方程为 dp[i][j] = min(dp[i-1][k] + C*|j-k| + (j-H[i]) ^ 2) if (j >= k) dp[i][j] = min(dp[i-1][k] - C*k) +C*j + (j-H[i])^2 if (j <= k) dp[i][j] = min(dp[i-1][k] + C*k) - C*j + (j-H[i])
阅读全文
摘要:变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种。内存中。具体点来说内存分为三块:静态区,堆区,栈区。外部变量和全局变量存放在静态区,局部变量存放在栈区,动态开辟的内存存在堆区。 一、简要性比较extern 外部变量声明,是指这是一个已在别的地方定义过的对象,这里只是对变量的一次重复引用,不会产生新的变量。static 静态数据,数据存放在全局数据区,但作用域只是本 文件/函数 中,所以你可以在两个不同的文件/函数内部申明同名的static变量,但是 它们是两个不同的全局变量。如...
阅读全文
摘要:auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。register 这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。static 常见的两种用途: 1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者...
阅读全文
摘要:请在(且只能在TC2.0)中运行下面代码,先不要看结果,想想会得到什么:#include<stdio.h>#include<stdlib.h>// 文章要求代码在Tc下运行 int main(int argn, char* argv[]){ char* szStringA = "Hello,world!"; char* szStringB = "Hello,world!"; *szStringA = '-'; // dev下上面的语句在执行过程中异常退出,说明dev并不允许改变字符串常量, dev下,如果查看szS
阅读全文
摘要:http://www.cnblogs.com/Lyush/archive/2012/03/23/2413160.html曾几何时,也写过这一题,那是刚跟着做什么状态压缩dp的时候,1844MS过的,现在终于0MS了.这次的做法有点不一样,首先原来的两个指数级的for循环嵌套,变成一个指数级嵌套一个合法状态的个数,状态的含义也发生了改变,由原来的0,1只表示覆盖,变成了0表示横向覆盖,1表示了纵向覆盖,0和1保留了更多的信息,最后采用了一种退化机制来确保一列中不出现连续的奇数个1,即如果出现了偶数个1的话,那么最后这个1就等价于0,表示下一行下的这一列为0为1均可.那么上一层的合法状态由于发生退
阅读全文
摘要:题意:给定一个矩阵,每个元素代表了一个开销,每个位置只能够由上,左,右这些位置传递过来,问从第一行走到最后一行的最少代价为多少.解法:1.最短路 若是用最短路来解这一题,我们需要进行构边,同层相邻的节点连双向边,不同层从上往下连单向边,最后设定一个超级源点和超级终点即可.代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <queue>#include <iostream>#include <algorithm>#include <ve
阅读全文
摘要:priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;classpriority_queue{private:vector<int>d
阅读全文
摘要:题意:完全符合树的重心:即找到一个点,其所有的子树中最大的子树节点最少.代码如下:#include <cstdlib>#include <cstring>#include <cstdio> #include <iostream>#include <algorithm>#define MAXN 20000using namespace std;//说白了这一题就是求一棵树的重心 int N, idx; // 说明有N个节点//由于节点较多,且数为稀疏图,因此采用邻接表的形式来存储struct Node { int x, next, cn
阅读全文
摘要:题意:给定一个数N (10 <=N <= 30),然后给你N个数,这N个数由0和1组成,这N个数可以看做是一个环.然后现在又一种操作,可以将连续的三个数进行翻转,也可以将整个序列顺时针旋转一圈.现在问是否存在通过一个操作来是的实现将所有的1都靠在一起.这题刚开始分析的时候只注意到连续的三个数的8种组合情况,然后只有四种情况是在翻转过程中产生变化的.但是这样的想法还是没有多大帮助.实在是不会了.因为我的整个思路在于去构造一个方法能够使得所有的1都连在一起.而题目只要我们输出YES或者是NO.参看了题解后恍然大悟:这里只要从奇偶性方面去思考就可以了.当我们从奇偶性去看一个状态的时候,最
阅读全文
摘要:题意:介绍一种控制台下的文件目录输出格式,要求进行模拟.详见代码代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <stack>#include <string>#include <vector>#include <algorithm>using namespace std;/* 目测应该要抽象出文件和目录这两个结构 对于文件我们可以有一个很清醒的认识,也就是说所 有的文件总是离
阅读全文
摘要:DP第二题,做过很多次了,这次没用记忆化搜索,而是先排序之后for循环进行动态规划.代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;int N;struct Point { double x, y; void read() { scanf("%lf %lf", &x, &y); }}p[105];int main() {
阅读全文
摘要:详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#define MAXN 100using namespace std;// 给定一个有数值的矩形,求出和最大的子矩形// 经典的DP问题/*思路:枚举所有的行,然后将这些行的列进行相加构成一个串 然后再进行一次一维空间上的DP即可 */int N, M[MAXN+5][MAXN+5], sum[MAXN+5][MAXN+5], seq[MAXN+5];int DP() { int Max =
阅读全文
摘要:详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;// 给定一个数N,求1-N的所有数与这个数的gcd之和// 观察gcd函数,我们可以得知那些与N互质的数的gcd一定为1,也就是欧拉函数 // 那么那些不互质的数有gcd(x, N) = d // 也就是gcd(x/d, N/d) = 1,所以我们继续求N/d的欧拉函数就可以了 int eular(int x) { // 直接对某一个数进行素因子分解求解 in
阅读全文
摘要:详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#define MOD 9901// 9901是一个素数 using namespace std;int A, B; // 计算A^B的所有因子的和 int num[50], ex[50], idx; // 记录所有的因子和指数void deal(int x) { idx = -1; for (int i = 2; i <= (int)sqrt(double (x)); ++i) { if (x
阅读全文