2011年12月5日
摘要: UVA_10118 我们可以定义f[n1][n2][n3][n4]为当四个piles分别拿到第n1、n2、n3、n4个糖果时,能够拿回家的最多的pair数,然后在状态转移的时候需要借助一个数组来记录basket的情况,可以容易想象的是,对于一个f状态,一定有唯一一个basket的状况(当然假设能取走的糖果都取走了)与之相对应。 为了实现起来更方便,我还是选用了记忆化搜索。#include<stdio.h>#include<string.h>#define MAXD 50int N, f[MAXD][MAXD][MAXD][MAXD], x[5][MAXD];int in 阅读全文
posted @ 2011-12-05 21:24 Staginner 阅读(883) 评论(0) 推荐(0) 编辑
摘要: UVA_10626 实际上我们注意到硬币的总状态不是很多,约是500*100*50(当然这么说并不准确,后面会再算),所以我们可以把硬币的组合形式看成一个状态。 剩下的问题就是如何转移状态,我们细算一下,发现花钱的策略不过这么几种,如果再分细一些,可以先分成有找零的和没找零的:①8个1分的;②3个1分的和1个5分的;③2个5分的找回2个1分的;④一个10分的找回2个1分的;⑤3个1分的和1个10分的找回1个5分的。其余的可能也有,但一定不会比上面五种决策更优。 显然递推是不好搞的,所以就不妨记忆化搜索吧。但注意到,我们按上面的策略花钱时,有些硬币是会增加的,所以我们要把上限算好。首先,③... 阅读全文
posted @ 2011-12-05 20:35 Staginner 阅读(576) 评论(0) 推荐(0) 编辑
摘要: UVA_10558 这个题目的意思是对于选定的streets,然我们选定A个avenues,使得它们划分出的选区的个数尽可能多,其中1和100是必须要选的。所谓的选区具备两个条件:①必须是横竖线所包围的一个矩形,且这个矩形内部没有横竖线;②矩形内至少包含一个neighborhood。 之后只要首先预处理出对于当前所画的竖线的条件下,如果画两条横线i、j(i<j)之间所构成的选区的数量s[i][j]。令f[i][j]表示当前选第i条横线时选在在第j条avenue上面时i下方的选区的总数,那么f[i][j]=max{f[i-1][k]+s[k][j]}。 另外读入数据时要注意neighbor 阅读全文
posted @ 2011-12-05 14:54 Staginner 阅读(396) 评论(0) 推荐(0) 编辑