摘要:
预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为 1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=min(f[i],f[i+strlen(b[j]+1)+g[i][j]]+g[i][j]) 也不是很难理 阅读全文
摘要:
只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从i到j的价格,长度从小到大枚举更新就行了 f[i][j]=min(f[i][j 1]+cost[s[ 阅读全文
摘要:
好久没写2 SAT了啊,还以为是网络流 设点x为选,x'为不选,因为一头牛至少要满足一个条件,所以对于牛条件的两个点,选了一个不符合的点,就要选另一个符合的点,这样连两条边 然后枚举所有议案的选和不选点,从当前枚举的点出发,dfs一遍,把经过的点都打上标记,然后判断当前枚举的点是否合法(没有一个议案 阅读全文
摘要:
……这可能是早年Pascal盛行的时候考排序的吧居然还是Glod…… 阅读全文
摘要:
k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则ans++ cpp include include include using namespace s 阅读全文
摘要:
模拟即可,注意包含可以是不连续的 方便起见读入的时候全转成小写 cpp include include using namespace std; const int N=1005; int n,m,s1,s2,ans[N]; struct qwe { int len; char s[N]; }c[N 阅读全文
摘要:
高精乘法板子 然而WA了两次也是没救了 cpp include include include using namespace std; const int N=105; int la,lb,lc,a[N],b[N],c[N],tot; char ch[N]; int main() { scanf( 阅读全文
摘要:
震惊!记忆化搜索忘记返回map值调了半小时! 边(u,v)的经过次数是:能到u的牛数\ v到n的方案数。正反两次连边,dfs两次即可 cpp include include include using namespace std; const int N=5005,M=50005; int n,m, 阅读全文
摘要:
长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.html非常严谨的证明 阅读全文
摘要:
4维枚举平方小于10000的数,相加等于n则ans++ cpp include include using namespace std; const int N=105; int n,a[N],ans; int main() { scanf("%d",&n); for(int i=1;i 阅读全文
摘要:
唔不知道怎么说……大概核心是把矩阵快速幂的乘法部分变成了Floyd一样的东西,非常之神 首先把点离散一下,最多有200个,然后建立邻接矩阵,a[u][v]为(u,v)之间的距离,没路就是inf 然后注意重载乘号的部分,注意到这样乘一次就相当于把本来存了经过k条路的最短路的邻接矩阵变成存了经过k+1条 阅读全文
摘要:
洛谷上能过的最大流bzoj上T了……但是贪心做法明明在洛谷上比最大流要慢啊……如果是最大流的话就是裸题了吧 说一下贪心,就按照防晒霜排序,然后对每一个防晒霜选一头可以使用的且r最小的牛 就,没了。 贪心 阅读全文
摘要:
和March的那道不一样,只是非常单纯的带着贪心的dfs 首先一个点被隔断,与它相邻的所有点也会被隔断,打上删除标记,从1dfs即可 cpp include include using namespace std; const int N=30005,M=200005; int n,m,q,h[N] 阅读全文