2011年12月7日
摘要: UVA_11081 感觉这个题目像是由求两个字符串的组成最长公共子序列的方案种数演变而来的,但上述问题我也没接触过,后来想想把这个题目的一部分剥离出去应该就能解决两个字符串的问题了吧。 我们选择用f1[i][j][k]、f2[i][j][k]分别表示拼到第k个字符时的结尾是第一串的、第二串的,用f[i][j][k]表示总的方案数。那么显然f[i][j][k]=f1[i][j][k]+f2[i][j][k],同时,f1和f2是分开计算的,应该有f1[i][j][k]=f1[i-1][j][k]+(a[i]==c[k]?f[i-1][j][k-1]:0),f2[i][j][k]=f2[i][j.. 阅读全文
posted @ 2011-12-07 21:21 Staginner 阅读(454) 评论(0) 推荐(0) 编辑
摘要: UVA_10280 没想到这个题目用一个剪枝和感觉上复杂度比较大的dp就可以过掉,当然这个题目的复杂度如果真仔细算起来感觉还是比较麻烦的,我在后面也提了几点设想,也许真正的复杂度没有到我们想象得那么大。 先把剪枝放在这里,设limit=min{max*min/(max-min)},那么如果酒量是大于limit的,就必然能够全部装下,否则我们再执行dp。 下面我们开始证明这个剪枝的正确性。我们不妨先对一类瓶子进行讨论,设其最小、最大的装酒量分别是min、max,实际上如果有[x/max]<[x/min],那么酒量x就一定可以全部被装进去,因为满足min*[x/min]<=x<= 阅读全文
posted @ 2011-12-07 19:14 Staginner 阅读(605) 评论(0) 推荐(0) 编辑
摘要: UVA_709 我们不妨用f[i]表示某行到第i个单词结束时的最小的badness,这样f[i]=min{f[i-1]+500,f[j]+badness},当然j+1到i这些单词必须能在这一行放得下。 之后我们不妨先考虑下对于一行而言,单词要怎么摆才最优。不难证明,各个空白的长度差越小越好,并且长度小的空白排在前面。 接下来,我们还要保证全文在满足badness最优的情况下,空白也得最优。如果空白最优,仅就到第i个单词而言,显然行数越少越优,在行数相等的情况下,显然第i个单词所在的这一行的单词数越少越优,于是我们再引入一个记录行数的数组s[]即可。 题目中提到过如果一行只有一个单词,仅... 阅读全文
posted @ 2011-12-07 12:32 Staginner 阅读(434) 评论(0) 推荐(0) 编辑
摘要: UVA_10163 这个题目数据范围比较小,所以一开始我写了M*N*logP的程序也能跑过。先说说二分的思路吧,我们可以二分每个仓库的安全值下限,然后去求最小费用。 后来看了别人的解题报告后发现,可以做两次dp,第一次dp求出最大的安全值下限,第二次dp再根据这个下限求出最小费用。#include<stdio.h>#include<string.h>#define MAXN 110#define MAXM 40#define INF 0x3f3f3f3fint N, M, P, f[MAXM][MAXN], p[MAXM];int init(){ int i, j; s 阅读全文
posted @ 2011-12-07 10:42 Staginner 阅读(360) 评论(0) 推荐(0) 编辑
摘要: UVA_10817 本来一开始没头绪的,后来寝室一哥们问我背包问题是什么,我解释完了之后突然发现这个问题也可以用背包去做。 由于对于每一个应聘的老师要么要要么不要,这就是0-1背包的特点了,剩下的问题是我们是否可以找到一个相当于体积的状态呢。 实际我们可以把每个课程还需几个老师教这一状态看做0-1背包问题的体积,不妨设f[i][j]为取到第i个老师课程状态为j时的最小花费,那么f[i][j]=min{f[i-1][j],f[i-1][k]+w[i]},其中k状态是由j状态加上第i个老师可以教课的状态得到的,如果某项大于2,就当做2来看待,意思是这个老师可以不教这门课。 初始化边界的时候将... 阅读全文
posted @ 2011-12-07 09:04 Staginner 阅读(1027) 评论(2) 推荐(0) 编辑