2011年11月30日
摘要: UVA_10401 这个题目本身并不难,但是如果用gets读的话要注意输入里面有空行。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 20char b[MAXD];int N;long long int f[MAXD][MAXD];void solve(){ int i, j, k, r; long long int res; N = strlen(b); memset(f, 0, sizeof(f)); if(b[0] == '?') { for(i = 0; 阅读全文
posted @ 2011-11-30 19:48 Staginner 阅读(351) 评论(12) 推荐(0) 编辑
摘要: UVA_10313 看了RoBa的题解之后,终于顿悟了。 这个题目涉及到一个结论,用不超过j个硬币凑出面值i的方案种数,是和用面值不超过j的硬币凑出面值i的方案种数是相同的。说得再数学一点,就是整数i拆分成不超过j个整数的拆分数,是和整数i拆成若干个值不超过j的整数的拆分数是相同的。具体的证明用到了Ferrers图像的性质。 这样的话我们就可以取一个二维数组f[i][j]表示用面值不超过j的硬币凑出面值i的方案的种数,那么如果我使用了面值j,对应方案种数就应该加上f[i-j][j],如果我们不使用面值j,那么对应的方案种数就应该加上f[i][j-1]。也就是说状态转移方程为f[i][j]=.. 阅读全文
posted @ 2011-11-30 18:30 Staginner 阅读(797) 评论(0) 推荐(0) 编辑
摘要: UVA_10029 这个题目一开始想转化成最长上升子序列的模型,但发现这样不好做,后来看了别人的题解发现可以转化成找有向无环图的最长路去做。 这样面临的一个问题就是如果显性地建图的话是没办法存下每条边的,于是我们不妨在每次尝试连线的时候再判断这条边是否存在。 为了方便判断两个字符串之间是否有一条有向边,我们不妨以起点为基础,施加3种变换,观察是否可以变换出字典里的字符串,如果可以变换出的话,就说明这两个字符串之间存在一条有向边。 对于判断是否可以变换出字典里的字符串这一步,可以用哈希表也可以二分查找字典。找最长路的过程可以采用记忆化搜索的方式。#include<stdio.h>#i 阅读全文
posted @ 2011-11-30 15:48 Staginner 阅读(861) 评论(7) 推荐(0) 编辑
摘要: UVA_10453 这个题目要求打印最后的结果,所以我们在动规的过程中要记录一下当前的决策,便于我们后面递归去打印回文串。#include<stdio.h>#include<string.h>#define MAXD 1010#define INF 1000000000int N, f[MAXD][MAXD], p[MAXD][MAXD];char b[MAXD];void printpath(int x, int y){ if(x > y) return; if(p[x][y] == 0) { if(x == y) prin... 阅读全文
posted @ 2011-11-30 13:41 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
摘要: UVA_10201 我们不妨用f[i][j]表示到第i个加油站油量为j时这个状态所需的最小花费,那么首先有一部分状态是从第i-1个加油站继承过来的,即f[i][j]=f[i-1][j+d[i]-d[i-1]],之后就是考虑在第i个加油站买多少油会更划算,那么状态转移方程为f[i][j]=min{min{f[i][k]+(j-k)*m[i]},f[i][j]},这样乍看上去是三个for,然而对于min{f[i][k]+(j-k)*m[i]}这个部分,实际上我们也可以写成f[i][k]-k*m[i]+j*m[i],而f[i][k]-k*m[i]这个部分仅和k有关,我们可以在循环j的时候顺便记录下最 阅读全文
posted @ 2011-11-30 13:06 Staginner 阅读(497) 评论(0) 推荐(0) 编辑
摘要: UVA_10154 首先,我们不妨证明一下这个命题,如果一个力量小的乌龟可以驮着一个力量大的乌龟,那么这个力量大的乌龟也必然可以驮起这个力量小的乌龟,而且还能够使两个乌龟上方增加承重能力。 我们不妨设力量小的乌龟的重量和力量分别为w1、s1,而力量大的乌龟为w2、s2,由于乌龟1可以驮起乌龟2,那么有s1>=w1+w2,如果我们假设乌龟2驮不起乌龟1,那么就应该有s2<w1+w2,然而我们知道乌龟2的力量更大,所以应该有s2>s1>=w1+w2,这样就产生矛盾了,原命题得证。 接着,如果乌龟1在乌龟2的下面,两龟上方的承重能力至多为s1-(w1+w2)。然而如果换成乌龟 阅读全文
posted @ 2011-11-30 01:27 Staginner 阅读(1030) 评论(0) 推荐(0) 编辑