洛谷 P2031 脑力达人之分割字串】的更多相关文章

题目传送门 解题思路: f[i]表示到第i位可获得的最大分割次数,对于每个f[i]都可由其符合条件的前缀转移过来,条件就是当前串除了前缀的剩余字符里有所给单词,然后一看,这不是在剩余字符里找有没有所给单词吗?所以果断KMP,其实本题好像不用KMP,暴力模拟就可以,但是为了练习KMP装逼,所以就写一下. AC代码: #include<iostream> #include<cstdio> using namespace std; ]; ][],f[]; inline int max(i…
P2031 脑力达人之分割字串字符串dp,f[i]表示主串到第i个字符,最多能分割成多少子串.f[i]=max(f[i],f[k]+1);k是能匹配到的前一位. #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #include<ma…
传送门 想了个4次方算法,没想到也A了,数据真是水. 其实两个字符串匹配那部分可以用kmp优化 ——代码 #include <cstdio> #include <cstring> ]; ], a[][]; inline int max(int x, int y) { return x > y ? x : y; } int main() { int i, j, k, l, len; scanf(, &n); ; i <= n; i++) scanf(); m =…
P2025 脑力大人之监听电话 题目背景 画外音: (声明:不要管前面那个,纯属意外,现已经重新编题,绝对原创) 上次海选,我们选出了参赛者中的20%参加本次比赛,现在我们将进行第二轮的筛选,这次的比赛将更加残酷.每25人为一组,其中的第一名将直接进入下一轮,而第4名以后的人(不包括第4名)将被直接淘汰.第2-4名将参加接下来的加赛,加赛中的前2%将进入下一轮. 欢迎您收看有洛谷卫视重磅推出的综合性文艺知识类节目“开心玩游戏,轻松赢比赛”,我是LUWM.学编程,就选洛谷, 感谢洛谷Online…
固定長度的字串(假設是 06481a63041b578d702f159f520847f8), 要照固定格式做切割, 使用 PHP 要怎麼切會比較快? 註: 要將此字串切成 => 06 / 48 / 1a63041b578d702f159f520847f8 這三個字串. 寫簡單的程式做個測試, 來比較 substr / sscanf / preg_match 的速度. 先設 $a = '06481a63041b578d702f159f520847f8';, 再執行下面程式做測試(全部都跑 100萬…
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\). 但是,一看数据范围,\(n\le100000\),这是要上天的节奏! 不过,再看\(m\le200\),比较显然应该是\(O(nm)\)的时间复杂度. 实际上,这题的确是可以用斜率优化\(DP\)来做到\(O(nm)\)的. 推性质 首先,我们要知道一个性质:将一个区间进行若干次分割,分割的顺序…
题目链接 假设有\(3\)段\(a,b,c\) 先切\(ab\)和先切\(bc\)的价值分别为 \(a(b+c)+bc=ab+bc+ac\) \((a+b)c+ab=ab+bc+ac\) 归纳一下可以发现切的顺序并不影响总价值. 于是设\(f[i][j]\)表示前\(i\)个数切\(j\)次的最大价值,转移方程就很简单了. 然后斜率优化一下就能降时间复杂度降到\(O(nk)\) \(f[i][j]=f[k][j-1]+sum[k]*(sum[i]-sum[k])\) \(f[k][j-1]-su…
题目描述 话说埃菲尔铁塔小区的房子只有一栋,且只有一层,其中每一家都装有一个监听器,具体地,如果编号为第i家的人给编号第\(j\)家的人打了电话,\(i \leq j\),当然,也会有些人无聊地自己给自己打电话,那么第\(i,i+1,i+2\),-,\(j-1\),\(j\)号的监听器都会收到一次信号.现在把每个监听器的收到信号数都告诉你(即\(A_1\)到\(An\)),请问他们至少打了几次电话? 输入输出格式 输入格式: 第一行一个数\(N\),表示用户数. 第二行\(N\)个数,表示监听器…
#include <iostream> #include <string> #include <cstring> int main() { const char *c = "2:212,2:213,2:214,2:215,2:216,2:217,2:218,2:219,2:220,2:221,2:222,2:223,2:224,2:225,2:226,2:227,2:228,2:229,2:230,2:231,2:232,2:233,2:234,2:235,2…
题目链接:传送门 题目大意:略 题目思路:DP 先预处理,分别以每个字母为中心处理能形成的回文串,再以两个字母为中心处理能形成的回文串. 然后 dp[i] 表示1~i 能形成的数目最少的回文串. 转移方程:if(vis[j][i]==1&&dp[i]>dp[j]+1)dp[i]=dp[j]+1; #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath&g…