摘要: 首先,定义S,表示前k个字符出现的集合,用二进制来压缩。 接下来,推出dp1[S],表示集合为S的子串的最长长度。 然后根据dp1[S]再推出dp2[S],表示集合为S或S的子集的子串的最长长度。 最后答案就是max(dp2[S]*dp2[补(S)]) 1 #include<cstdio> 2 #i 阅读全文
posted @ 2015-12-31 17:10 WABoss 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 一个工人可以变成两个工人,这样可以画出一颗二叉树,那么就是在叶子上建的建筑。 问题的时间花费,可以看作是这颗二叉树中各个叶子的深度*k+叶子对应建筑耗费时间中的最大值。 容易想到,类似哈夫曼树一样,从叶子出发往上合并,直到连通分量数小于等于m,结点的权值设定为w=max(lw,rw)+k。 1 #i 阅读全文
posted @ 2015-12-31 16:08 WABoss 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 比赛时没做出这题太可惜了。 赛后才反应过来这就是个中缀表达式求值,数字栈存的不是数字而是多项式。 而且,中缀表达式求值很水的,几行就可以搞定。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace 阅读全文
posted @ 2015-12-31 15:45 WABoss 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 枚举所有Strong King的状态(最多1024种左右),然后判断是否合法。 判定合法用网络流,源点-比赛-人-汇点,这样连边。 源点向每场比赛连容量为1的边; 如果一场比赛,A和B,A是Strong King且A的胜场小于B那么这场比赛向A连容量1的边,否则这场比赛向A和B都连容量1的边; 每个 阅读全文
posted @ 2015-12-31 10:48 WABoss 阅读(245) 评论(0) 推荐(0) 编辑
摘要: dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t]=min(dp[v][t],dp[u][t-1]) (dis[u][v]<=l) 放进SPFA更新, 阅读全文
posted @ 2015-12-31 09:20 WABoss 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 利用Floyd的DP状态转移方程。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 111 7 int n,m; 阅读全文
posted @ 2015-12-31 08:26 WABoss 阅读(286) 评论(0) 推荐(0) 编辑