题目链接 Alternating Strings II 题意是指给出一个长度为n的01串,和一个整数k,要求将这个01串划分为很多子串(切很多刀),使得每个子串长度不超过k,且每个字串不是01交替出现的串(例如01, 10, 101, 010, 101010这些都是01交替出现的串),求最少需要切多少次 令F[i]代表前i个数所需要切的最少的刀数(从1开始计数),那么有 F[i]  = min{F[j] | |j + 1, i| <= k 且 [j, i]这个子串不是01交替出现的串} + 1…
比赛链接:https://vjudge.net/contest/405905#problem/D 题意: 给你一个长度为n的由0或1构成的串s,你需要切割这个串,要求切割之后的每一个子串长度要小于等于k.且每一个子串内不能全都是01交替,就比如 00101010.11010101这样没有问题,不需要切割,因为前面有两个相同的 01010101.10101010这样就不行,就必须切割开 问你最少需要切割多少次 题解: 我们设定输入的01串下标从1开始 我们使用dp[i]表示:s字符串的从第1个字符…
http://codeforces.com/gym/100712/attachments 题意: 给出一个01串,现在要切割这个01串,使得每个子串长度都不大于k,并且每个子串不能01交替出现,单个字符是合法的. 思路:很容易想到用dp去做,但是怎么做呢? 我们可以先预处理一下i~j是否是合法的子串,即是否是01交替出现的串. 接下来我们从尾部开始,d[i]表示i~n所需的最少切割数.那么每次在左边新加入一个数字时,怎么确定它的最少切割数呢? 设f[i][t]不是01交替的串并且长度是小于等于k…
题目链接:http://codeforces.com/gym/101102/problem/D 题目大意:给你一个n*m的矩阵,矩阵里面的数值范围为[1,1e9].这个矩阵有一个值,如果相邻的多个数字是一样的,那么val += 他们的组合数,例如 1 1 1,那么就是val就是6. 问最后这个矩阵是val是多少? 思路: 我们固定右端点,先统计出上方有几个和他数值相同的数字,并把这个定义成这个位置的高,然后每次往统计以这个点为右下角的端点数即可.然后暴力右下角就是O(n*n) 我们发现,如果要每…
http://codeforces.com/gym/100801 题目大意:有从左到右有n个车站,有n-1种车票,第i种车票一次最多可以坐 i 站(1<=i<=n)   每种票有固定的价钱p[i],下车后可以继续上车,但每次下车都要再上车都要花费一定时间v[i],第1和n站上车不花费时间,车从一站到相邻的一站需要1分钟.只能买一种车票,问在t时间内 所有能从第1站到 第n站的方案  花费 的票价最低是多少. 解题思路: 这道题的关键在于如何求每种票起点到达终点所需的最少时间,如果找出了每种票到…
De Prezer loves rectangles.He has a n × m rectangle which there is a number in each of its cells. We show the number in the j - th column of the i - th row by ai, j. De Prezer also loves query. So he gives you q queries. In each query, he gives you n…
题意: 现在有1,2,3...N这N个站, 给定限定时间Limt,  N-1种票的价格, 分别对应一个最远距离,  叫你选择一种票, 满足可以在规定时间到达N站台,而且价格最低 思路: 如果买距离为L的票可以在规定时间到,那么距离>L的票也一定能到. 我们只需要二分出这个下界 L,然后在>=L里选择一个最低价格即可. 二分里面用单调队列优化. 复杂度O(NlgN). (注意可能爆 long long #include<bits/stdc++.h> #define ll long l…
3e7暴力,800ms+过,单调队列维护区间最小值. #include<bits/stdc++.h> using namespace std; typedef long long ll; ; int x[maxn], dq[maxn], pos[maxn]; int main() { freopen("minima.in","r",stdin); freopen("minima.out","w",stdout);…
题意:有一个长度为n的01序列,你可以移动k次,每次将一个数移到任意一个位置,求经过操作后区间连续最大的连续0的个数. “移动”操作看似情况很复杂,不好讨论,但其实无非就两种情况: 一.移动的是1:显然最优的策略是将1移动到最边上(相当于“移走”),目的是将两段连续的0合并. 二.移动的是0:最优策略是将小堆中的0移动到大堆里,目的是增加大堆中0的个数. 这样一来,情况就简单多了,问题转化成了求“将一段连续区间中的0合并,然后剩下的操作次数用于把其他地方的0引进来”的最优解,即求$min(max…
显然可以先把被覆盖掉的区间去掉,然后排个序,左.右端点就都是单调的 设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度 (如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底到哪是没删的) 那么有$f[i][j]=max\{f[k][j-(i-k-1)]+R[i]-max(L[i],R[k])\} ,k<i$ 稍微理解一下:k是我们下一次钦定要选的,中间的区间就都扔掉,然后有两种情况:k和i重合或不重合,那新增加一个i区间多覆盖的长度就要从i的左端点和k的右端点挑一个较…