dp

Leetcode(10)正则表达式匹配

我们两清 提交于 2019-12-01 10:28:20
Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符。 '*' 匹配零个或多个前面的元素。 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。 第一次:未完成(未能解决.*问题 class Solution: def isMatch(self, s: str, p: str) -> bool: index_s=0 index_p=0 form_num='' if len(s)==0: if len(p)==0 or p==".*": return True else: return False if len(p)==0: return False for i in p: ##s p都不为空 if index_s==len(s): return False elif i==s[index_s] or i=='.': form_num=p[index_p] index_s+=1 index_p+=1 elif i=='*': if index_p==0: form_num=p[index_p] index_p+=1 elif form_num=='.': ##if index_p!=len(s): ## 没有很好的办法去处理.*后面还有字符的问题 ##else

P2258 子矩阵——搜索+dp

大城市里の小女人 提交于 2019-12-01 09:32:23
P2258 子矩阵 二进制枚举套二进制枚举能过多一半的点; 我们只需要优化一下第二个二进制枚举的部分; 首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右; sum_shang,sum_heng 然后DP查找最小值 dp[i][j]表示前i列已经选了j列; #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=20; int n,m,r,c; int a[maxn][maxn]; int id[maxn]; int b[maxn]; int sum_s[maxn]; int sum_h[maxn][maxn]; void pre_pare() { memset(sum_s,0,sizeof(sum_s)); int num=0; for(int i=1;i<=n;i++) if(b[i]) id[++num]=i; for(int i=1;i<r;i++) { for(int j=1;j<=m;j++) { sum_s[j]+=abs(a[id[i]][j]-a[id[i+1]][j]); } } for(int i=1;i<=m;i++) { for(int j=i+1;j<=m;j++) { sum_h[i][j]=0; for(int k=1

分手是祝愿:dp

自作多情 提交于 2019-12-01 07:43:29
Description Zeit und Raum trennen dich und mich. 时空将你我分开。 B 君在玩一个游戏,这个游戏n 个灯和n 个开关组成,给定这n 个灯的初始状态,下标为从1 到n 的正整数。 每个灯有两个状态亮和灭,我们用1 来表示这个灯是亮的,用0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉。 但是当操作i 个开关时,所有编号为i 的约数(包括1 和i )的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮。 B 君发现这个游戏很难,于是想到了这样的一个策略,每次等概率随机操作一个开关,直到所有灯都灭掉。 这个策略需要的操作次数很多,B 君想到这样的一个优化。如果当前局面,可以通过操作小于等于k 个开关使所有灯都灭掉 那么他将不再随机,直接选择操作次数最小的操作方法(这个策略显然小于等于k 步)操作这些开关。 B 君想知道按照这个策略(也就是先随机操作,最后小于等于k 步,使用操作次数最小的操作方法)的操作次数的期望。 这个期望可能很大,但是 B 君发现这个期望乘n 的阶乘一定是整数,所以他只需要知道这个整数对100003 取模之后的结果。 1<=n<=100000,0<=k<=n。对于50%的数据,k=n。 这题也是咕了好久啊,今天难得改题快,回来把它干了。 然而我颓题解了,想了几次了也没有想出来,呃。。。颓题解再怎么样也比干脆不做好一些

AcWing - 512 - 飞扬的小鸟 = dp

此生再无相见时 提交于 2019-12-01 06:18:46
https://www.acwing.com/problem/content/514/ 想到的一种解法是,每隔x个高度抽点出来。 比如从j高度开始。 判断j+x高度时: dp[i][j]+1 判断j+2x高度时: dp[i][j+x]+1,dp[i][j]+2 可以看到后面的这个是一起+1的,所以最小值也是和新加的项取min,然后+1就可以了。 每个点只会被更新一次,复杂度O(nm)。 来源: https://www.cnblogs.com/Inko/p/11664571.html

6. 动态规划

早过忘川 提交于 2019-12-01 02:03:35
线性DP 背包 区形DP 树形DP 环形与后效性处理 状态压缩DP 倍增优化DP 数据结构优化DP 单调队列优化DP 斜率优化 四边形不等式 计数类DP 数位统计DP 总结与练习 来源: https://www.cnblogs.com/hebust-fengyu/p/11647244.html

[CTSC2018]假面 —— DP

流过昼夜 提交于 2019-12-01 01:55:23
题面    LOJ#2552 解析    很有意思(难)的一道期望概率$DP$   先解决问题$1$     把血量当作背包重量,概率当作背包权值,可以做类似于背包的转移, 对于第$x$号人,设$res1$是命中的概率, $res2$是不能命中的概率, $val[x]$是初始血量   于是有:$dp[x][j] = dp[x][j] * res2 + dp[x][j+1] * res1 (1 \leqslant j < val[x])$   特别地:$dp[x][0] = dp[x][0] + dp[x][1] * res1$ (血量为$0$时就不再扣血了)       $dp[x][val[x]] = dp[x][val[x]] * res2$ (血量满血时不会有转移进来的状态)   最后的对于$i$号敌人的答案就是$\sum_{j = 1}^{val[i]}j * dp[i][j]$   注意转移方程的先后顺序即可   再解决问题$2$   设$f[i][j]$为前$i$个人中存活了$j$个人的概率,设第$i$个人的编号为$id$, 显然可以分为第$i$个人当前是否存活进行转移:$f[i][j] = f[i-1][j] * dp[id][0] + f[i-1][j-1] * (1 - dp[id][0])$   同样可以倒序枚举$j$,于是$f$数组就消去了第一维

【XJOI】小H的硬币游戏

柔情痞子 提交于 2019-11-30 23:07:31
题目链接(别想了) 小H的硬币游戏 题目描述 小H参加了一场神秘的游戏。游戏中有 \(n\) 堆硬币,第 \(i\) 堆价值 \(a_i\) 。每次小H可以选择编号相差 \(k\) 的硬币同时拿走。注意拿走后硬币不进行重标号。小H想知道最多能拿走多大价值的硬币。 输入格式: 第一行两个整数 \(n\) , \(k\) 。 第二行 \(n\) 个整数。第 \(i\) 个整数表示 \(a_i\) 。 输出格式: 一行一个整数,表示拿走硬币的最大价值。 样例输入: 7 3 7 5 8 6 4 3 2 样例输出: 33 数据规模: 对于 \(20%\) 的数据, \(n<=20\) 。 对于 \(40%\) 的数据, \(n<=2000\) 。 对于另外 \(20%\) 的数据, \(k<=10\) 。 对于 \(100%\) 的数据, \(n<=100000\) , \(k<=n\) , \(ai<=1000000000\) 。 时间限制 1s 内存限制 256M 题解 题目要求给 \(n\) 个数,每对序号相差 \(k\) 的数可以被取走,求取走的数的和最大为多少。 因为每次取的数对序号相差必须为 \(k\) ,所以如果一个数的序号为 \(x\) ,那么对这个数有影响的数的序号为 \(a*k+x%k\) 。 那么我们可以把这 \(n\) 个数根据它们的序号 \(modk\) 的值分成

常见算法代码模板

你离开我真会死。 提交于 2019-11-30 22:39:11
递归 def recursion(level, param1, param2,...): # recursion terminator if level > MAX_LEVEL: return # process login in current level process_data(level, data,...) # drill down self.recursion(level + 1, p1, ...) # reverse the current level status if needed reverse_state(level) 广度优先搜索 visited = set() def dfs(node, visited): visited.add(node) # process current node here. for next_node in node.children(): if not next_node in visited: dfs(next_node, visited) 深度优先搜索 def bfs(graph, start, end): queue = [] queue.append([start]) visited.add(start) while queue: node = queue.pop() visited.add(node) process

【类背包】P1156 垃圾陷阱

不打扰是莪最后的温柔 提交于 2019-11-30 21:32:41
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int dp[101][1001]; 6 7 struct rub 8 { 9 int t, g, h; 10 }c[101]; 11 12 bool cmp(rub a, rub b) 13 { 14 return a.t < b.t; 15 } 16 17 int main() 18 { 19 int d, g; 20 cin >> d >> g; 21 for (int i = 1; i <= g; i++) 22 { 23 cin >> c[i].t >> c[i].g >> c[i].h; 24 } 25 sort(c + 1, c + g + 1, cmp); 26 dp[0][0] = 10; 27 for (int i = 1; i <= g; i++) 28 { 29 for (int j = 0; j <= d; j++) 30 { 31 if (dp[i - 1][j] >= c[i].t) 32 dp[i][j] = max(dp[i][j], dp[i-1][j]+c[i].g); 33 if (j >= c[i].h && dp[i - 1][j - c[i].h]>=c[i].t) 34 dp[i][j] =