摘要:
ac的第一题状态压缩的dp。状态涉及前两行,通过“加一维”的方式能够解决。还要注意由于炮兵的限制,能够符合的所有排列其实非常少(远小于2^10,据说在70个左右)知道这一点,预处理出所有可能的状态,再通过其他限制条件(地形,前两行状态)进行筛选。F[i,j,k]表示第i行,i-1行的状态为j,i-2行状态为k。不包括第i行最多能布置多少炮兵。F[i+1,v,j] = MAX( F[i+1,v,j],F[i,j,k] + sum[v] )。sum[v]表示v排列(行排列)有多少个炮兵。状态转移的要求是v,j,k兼容,并且v与第i行地形兼容。所以枚举 i,j,k,v 效率 O( n*PSB^3 ) 阅读全文
摘要:
代码整理软件。在百度空间这样不支持代码显示插件的博客里也能够漂亮的显示代码。下载地址(附源码):http://u.115.com/file/f3df1b2b31//done 2011.5.2#include <iostream>#include <string>#include <assert.h>#include <fstream>#include <stdlib.h>using namespace std;string _gSelfPos;const string _MODEL[2]= { "<span style 阅读全文
摘要:
定义如下规则序列(字符串):1.空序列是规则序列;2.如果S是规则序列,那么(S)和[S]也是规则序列;3.如果A和B都是规则序列,那么AB也是规则序列。 例如,下面的字符串都是规则序列:(),[],(()),([]),()[],()[()] 而以下几个则不是:(,[,],)(,()),([()现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列。(对于序列a1,a2,…, 和序列bl,b2,…, ,如果存在一组下标1≤i1<i2<…< ≤m,使得aj= 对一切1≤j≤n成立,那么a1,a2…, 阅读全文
摘要:
一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。具体解析我就很不客气的贴上tyvj上的解答了:一个很显然的想法.用f[i,x1,x2,x3]表示第i时刻三个人的位置是x1,x2,x3(并不是三个人分别在).用p[i]表示i时刻的请求,用map[i,j]表示把人从位置i感到位置j的代价.则可以得到一个很显然递推式:f[i,p[i] 阅读全文