摘要:头文件:string(无.h!)string类的构造函数与析构函数:1、string s;2、string s(str);// copy str to s;3.string s(str, strhead);//copy str to s from the strhead position4.string s(str,strhead,strtail);//copy str to s from strhead to strtail5.string s(cstr);//copy a c string to s;6.string s(char*, char*len);//copy a c string 阅读全文
动态规划--dominoes
2013-02-27 12:34 by Dr.Ray, 250 阅读, 0 推荐, 收藏,
摘要:每个骨牌1*2,给出一个3*n的矩形,求用骨牌填满矩形的方法的数量。首先,边际情况分析,3*1无解,3*2有3解,3*3无解,3*4除了分成2个3*2的情况以外还有2个解,。。。。。。。。易得n必为偶数。分析完以后,还是不能找到递推。。但是一个一个去掉dominoe会发现,填充一端可看做3种可能,1、齐边,2、缺一个角 3、缺一个竖向骨牌(与2加一个横向骨牌不同的情况),图示:0表示横向骨牌,1表示竖向。1: 00 2:前面齐边,紧跟一个: 3:前面齐边后跟:00 00 00 1 1 00 00 ... 阅读全文
动态规划模型3,数塔问题
2013-02-22 09:09 by Dr.Ray, 260 阅读, 0 推荐, 收藏,
摘要:掌握了三要素方法这道题还是比较容易的。 这道题有一点让我比较混乱,就是正推还是倒推的问题,因为没有特殊限制,所以这道题正推倒推都可以得到正确解,无非是把塔给倒转一下,路径上的最大值还是不变的。但是,如果用正推,在推边缘上的项的状态时,就要多出一个判断上面的项是否在塔中的步骤,而倒推的话是从下面的项推上面的项,无此担忧。最后输出顶点的状态就是答案了。 另外要注意的是在初始化最底层状态时我利用了最底层的下一层的0,在其他题目中这可能会使错误的, 注意验证代码:#include<stdio.h> #include<stdlib.h> #include<string.h& 阅读全文
随机数发生器
2013-02-20 18:28 by Dr.Ray, 248 阅读, 0 推荐, 收藏,
摘要:#include<stdio.h>#include<stdlib.h>//rand(),srand(),RAND_MAX#include<time.h>//time(NULL)double random()//生成0-1的随机数{return (double)rand()/RAND_MAX;}int random1(int m)//生成0-m的随机数{return (int ) (random()*m + 0.5);}int main(){srand(time(NULL));//初始化随机数种子。time(NULL)返回从1970年1月1日0点以来经过的秒数 阅读全文
动态规划01背包3
2013-02-19 14:39 by Dr.Ray, 164 阅读, 0 推荐, 收藏,
摘要:输入货币种类数v,金额n,和v个币值,求组成金额n的货币搭配种类数。关键是用opt状态数组来储存种类数,其他和01背包一样。这次的状态转移方程是我自己写出来的,比较有成就感!另外注意钱币数量无限制,所以第二层循环要用顺推而非倒推。阶段:用来组合的币值的种类数状态:当前金额的组合种类数状态转移方程:opt[j] += opt[j-w[i]] w[i]为币值。状态转移方程推导经验小结: opt[j] += opt[j-w[i]]是怎么来的? opt[j-w[i]]是去掉一个钱币的金额的组合数,因为只是多了一个币,所以用j-w[i]组成j的组合数就是opt[j-w[i]],于是就有opt[j] += 阅读全文
动态规划01背包2
2013-02-18 17:07 by Dr.Ray, 179 阅读, 0 推荐, 收藏,
摘要:例题8: 给定最大时间,要求采药总价值最大。 输入:第一行两个数据,time给定时间,n药材种类数,之后n行,t[i]采这株药的时间,w[i]这株药的价值。输出:可采的最大总价值。例题9: 给定最大金额,要求sum:v[i]*w[i];最大输入: 第一行:N最大金额,m物品数量,后M行:v[i],w[i] 输出:最大的sum 这类题和经典背包问题差不多,关键在于opt此时不仅是判断能否装满背包的状态,还是储存当前的总价值或者sum 的状态。 要注意金额或者时间是会重复的,于是opt要储存当前最大的总价值或者sum。 下面以例题8为例 一开始我想再用另一个数组tot储存总价值,opt仅仅用来判定 阅读全文
动态规划模型2,01背包问题
2013-02-17 14:20 by Dr.Ray, 359 阅读, 0 推荐, 收藏,
摘要:01背包问题: 有n个物品,每个体积为v[1-n],问这些物品能否装满体积为b的背包,物品不能切分,形状因素忽略不计。求背包最小剩余空间。阶段:以v数组的下标划分状态:opt[]为0或1状态转移方程:opt[j] = opt[j - v[i]]思路: opt[b+1]代表体积为0~b的背包能否被装满,0否1能; 于是就要知道所有物品体积组合之和。 我理所因当想到用循环,多层循环强行组合不可能,因为循环层数不确定。 可以用两层循环如//key!,先记一个物品v1体积的opt[v1]=1,接着只要体积v2于之前出现过的体积v1加上另一个物品的体积则opt[v2]=1。 注意第二层必须用倒推,否则 阅读全文
动态规划第一题
2013-02-16 11:18 by Dr.Ray, 191 阅读, 0 推荐, 收藏,
摘要:找一个无序数列中最长的非降序子数列。 此题目中,状态为一维的。证明这个题目可以用动态规划解决,即证明满足最优性原理(即具有最有子结构)和无后效性。证明满足最优性原理: 这一块我目前还不太清晰,试着说明。序列记为{an} 对于前i-1个数,最长非降序子序列用到ak,长度为c,那么加入ai后长度为c+1或c,则前i 个数中最长子序列长度还是c或c+1 对于前k-1个数,同上。 于是,在前j个数中,最长子序列长度为q,那么q或q-1为前j-1个数的最长非降序子序列长度,满足最有型原理。 证明满足无后效性: 明显第i个状态只用考虑前i-1个数,遂无后效性。三要素:阶段: 按序列角标划分阶段。状态:开. 阅读全文
cantor数表
2013-02-06 11:15 by Dr.Ray, 247 阅读, 0 推荐, 收藏,
摘要:#include<stdio.h>int findline(int n) { for(int i = 1;;i++) { if(i*(i-1)/2 >= n) { return i-1; } } }int main() { int n,temp,line,rever; scanf("%d",&n); line = findline(n); if(line%2 == 0) { temp = n - line*(line-1)/2; rever = line - temp + 1; } else if(line%2 == 1) { rever = n 阅读全文
5.3.2 字母重排
2013-02-06 10:42 by Dr.Ray, 151 阅读, 0 推荐, 收藏,
摘要:1、qsort 函数qsort(void *base, int num, int width, int order)base :待排序的指针num : 指针中元素的个数width :元素的长度order :一般用函数表示,如果排char的顺序,则int cmp_char(const void *a, const void *b){ return *(char*)a - *(char*)b;}再调用qsort(word, strlen(word), sizeof(word), cmp_char)即可将word排序。注意cmp_char不用加参数。2、strcpy(char *a, const c 阅读全文