代码改变世界

随笔分类 -  解题报告

动态规划--dominoes

2013-02-27 12:34 by Dr.Ray, 250 阅读, 收藏,
摘要: 每个骨牌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,在其他题目中这可能会使错误的, 注意验证代码:#include<stdio.h> #include<stdlib.h> #include<string.h& 阅读全文

动态规划01背包3

2013-02-19 14:39 by Dr.Ray, 164 阅读, 收藏,
摘要: 输入货币种类数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 阅读, 收藏,
摘要: 例题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 阅读, 收藏,
摘要: 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 阅读, 收藏,
摘要: 找一个无序数列中最长的非降序子数列。 此题目中,状态为一维的。证明这个题目可以用动态规划解决,即证明满足最优性原理(即具有最有子结构)和无后效性。证明满足最优性原理: 这一块我目前还不太清晰,试着说明。序列记为{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 阅读, 收藏,
摘要: #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 阅读, 收藏,
摘要: 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 阅读全文

5.3.1 6174问题

2013-02-04 17:37 by Dr.Ray, 118 阅读, 收藏,
摘要: 1、for循环第一栏只能支持一个语句的初始化2、注意运用状态变量 阅读全文

最短周期串

2013-02-04 16:56 by Dr.Ray, 217 阅读, 收藏,
摘要: 若t为最小周期,则a[i]==a[i%t];收获:1、 strlen不计末尾\n,\0的长度,即 a[1000],在标准输入中输入huhuhu并回车,strlen(a)==6;注意,遍历该数组要i<=strlen(a)-1别忘了-1;2、 0%k==03、 for(int i=0;i<10;i++) { int temp=0; """"""""""""} 每次i值改变,进入循环体后都会新建一个 temp 阅读全文

acmsteps第一章解题报告

2013-01-28 22:07 by Dr.Ray, 113 阅读, 收藏,
摘要: 1、不要用scnaf返回值进行多值输入的终止判定,用scanf("%d")!=EOF;2、end of line :\n 阅读全文