2011年12月6日
摘要: UVA_10599 一开始我写的时候把一个点有多个垃圾的情况也考虑进去了,后来交了一下发现是不存在这种情况的。 这个题目由于只能往右走或者往下走,而且路线的不同是以垃圾的位置区分的,那么我们不妨转化成最长上升子序列的问题去处理。 最后为了能明确得出路线的条数,如果终点没有垃圾的话我们不妨把终点也加进去,只不过标记一下这里没有垃圾就可以了,在打印路径的时候不打印出这个点即可。#include<stdio.h>#include<string.h>#define MAXN 110#define MAXD 10010int N, M, g[MAXN][MAXN], p[MAXD 阅读全文
posted @ 2011-12-06 20:48 Staginner 阅读(495) 评论(0) 推荐(0) 编辑
摘要: UVA_11258 用f[i]表示到第i个位置为止分成的数的和的最大值即可。#include<stdio.h>#include<string.h>#define INF 0x7fffffff#define MAXD 210long long int f[MAXD];char b[MAXD];void solve(){ int i, j, k, N; long long int v; scanf("%s", b); N = strlen(b); memset(f, 0, sizeof(f)); for(i = 0; i < N; i ++) { 阅读全文
posted @ 2011-12-06 19:47 Staginner 阅读(334) 评论(0) 推荐(0) 编辑
摘要: UVA_10723 首先这个题目肯定是按最长公共子序列的形式进行dp的,因为只有保证消去的一部分是最长公共子序列才能保证最后生成的序列最短。 因此,在记录方案数的时候我们也按最长公共子序列的生成过程来记录即可,我们不妨用p[i][j]记录最长公共子序列的字符数,用f[i][j]表示到第一个字符串第i个位置、第二个字符串第j个位置时生成的序列最短的方案种数。 当a[i]!=b[j]时,p[i][j]=max{p[i-1][j],p[i][j-1]},那么如果p[i][j]==p[i-1][j],f[i][j]+=f[i-1][j],如果p[i][j]==p[i][j-1],f[i][j]+=.. 阅读全文
posted @ 2011-12-06 17:51 Staginner 阅读(496) 评论(0) 推荐(1) 编辑
摘要: UVA_11008 这个题目由于树的数目很少,我们可以把树的状态压缩成一个整数,并依此来进行状态转移。 为了方面后续的状态转移,我们可以预处理出任意两个树连线上树的分布情况,处理的时候同样选择把状态压缩成一个整数,这样在后面就只需要一个位运算的式子就可以消去这条线上所有的树了。 这样对于一个树林的状态tree,我们就可以枚举其中两棵树,打掉这条线上的所有树就可以了,用记忆化搜索实现起来会比较方便。 此外,最后有可能会出现剩余一棵树的情况,对于这种情况我们没有必要单独列一个每次只打某一棵树的决策,因为如果剩余的不只一棵树,显然这样不是最优的,这样做反而会可能增加很多无用的状态,因此我们用一... 阅读全文
posted @ 2011-12-06 15:51 Staginner 阅读(422) 评论(3) 推荐(0) 编辑
摘要: UVA_10913 为了保证每个格子只走一遍,所以对于每行,我们都从左往右dp一次,再从右往左dp一次,每个格子取两次dp的最大值即可。 如果用递推去做的话,f可以初始化成-INF,但注意只有当前的格子不等于-INF时才进行dp,否则如果下一个格子是正值的话,会当做可以到这个格子,并且路径值是-INF。#include<stdio.h>#include<string.h>#define MAXN 80#define MAXK 10#define INF 0x3f3f3f3fint N, K, a[MAXN][MAXN], f[MAXK][MAXN][MAXN], lef 阅读全文
posted @ 2011-12-06 14:32 Staginner 阅读(425) 评论(0) 推荐(0) 编辑
摘要: UVA_10604 一开始看错题了,以为化学物质最多会有10个,所以定义不了10维的去跑,便用了类似状态压缩的方式,把化学物质的状态压缩成一个整数,然后用哈希表建立一个索引,再用记忆化搜素去处理就可以了。 之所以能这么做,关键在于总状态并不是很多,我们可以粗略的估算一下,即便有10种药品时,状态最多有(10^10)/10!,考虑到混合之后达到的状态,最多再乘个10而已,用计算器算一下,数值还是比较小的。 当然这个题目可以用6维的数组去跑,但如果药品数多了之后n维的f显然空间是开不下的,但总状态数却不是很多,所以哈希表虽然写着复杂,但多少有些适用范围的优势。 此外,要注意到这个题目A和B混... 阅读全文
posted @ 2011-12-06 13:05 Staginner 阅读(522) 评论(0) 推荐(0) 编辑
摘要: UVA_607 我们可以首先预处理出来一节课可以连着上哪些topic,并且这节课的满意度是多少。 之后用两个数组f[i]、s[i],分别表示一直上到以课程i为结尾的课时的总满意度以及上过的总课时数,动规的过程就像是跳房子,看当前位置可以跳到那个位置,就尝试去更新那个位置。#include<stdio.h>#include<string.h>#define MAXN 1010#define MAXL 510#define INF 0x3f3f3f3fint N, L, C, f[MAXN], t[MAXN], p[MAXN][MAXN], s[MAXN];int init 阅读全文
posted @ 2011-12-06 00:24 Staginner 阅读(310) 评论(0) 推荐(0) 编辑