- 博客(353)
- 资源 (17)
- 收藏
- 关注
原创 AcWing DFS相关问题 165. 小猫爬山
import syssys.stdin = open('data.txt', 'r')'''先降序排序,然后递归枚举每一只猫放到哪辆车上,要么放在已经存在的车上,要么重新加一辆车,放到新车上'''arr = []n, w = map(int, input().split())for i in range(n): arr.append(int(input()))arr.sort(reverse=True)sum_weight = [0] * 20ans = [0x7.
2020-08-06 01:21:41
331
原创 AcWing BFS相关问题 1107. 魔板
import syssys.stdin = open('data.txt', 'r')'''BFS 状态拓展应用'''from collections import dequetarget = list( map(int, input().split()) )def hash(arr): ans = 0 base = 1 for i in range(8): ans += arr[i] * base base *= 10 .
2020-08-06 01:20:32
401
原创 AcWing BFS相关问题 1100. 抓住那头牛
import syssys.stdin = open('data.txt', 'r')'''简单BFS找最短路长度'''from collections import dequem, n = map(int, input().split())def bfs(m, n): que = deque() que.append(m) visited = {m} step = 0 while len(que) > 0: node..
2020-08-06 01:18:28
360
原创 AcWing BFS相关问题 1098. 城堡问题
import syssys.stdin = open('data.txt', 'r')from collections import dequegrid = []m, n = map(int, input().split())for i in range(m): grid.append( list(map(int, input().split())) )def bfs(i, j) -> int: que = deque() que.append((i, j.
2020-08-06 01:17:35
329
原创 AcWing BFS相关问题 1097. 池塘计数
import syssys.stdin = open('data.txt', 'r')from collections import dequegrid = []m, n = map(int, input().split())for i in range(m): s = input() grid.append( [val for val in s] )def bfs(i, j): que = deque() que.append((i, j)) .
2020-08-06 01:16:35
290
原创 AcWing BFS相关问题 1076. 迷宫问题
import syssys.stdin = open('data.txt', 'r')'''简单bfs应用'''from collections import dequegrid = []n = int(input())for i in range(n): grid.append( list(map(int, input().split())) )prev = {(0, 0): None} # 记录路径que = deque()que.append((0, 0).
2020-08-06 01:15:43
240
原创 AcWing BFS相关问题 188. 武士风度的牛
import syssys.stdin = open('data.txt', 'r')'''BFS层次遍历,求最短路径长度'''from collections import dequen, m = map(int, input().split())si, sj = -1, -1ei, ej = -1, -1grid = []for i in range(m): s = input() grid.append( [ch for ch in s] ) ..
2020-08-06 01:14:26
235
原创 AcWing BFS相关问题 173. 矩阵距离
import syssys.stdin = open('data.txt', 'r')'''多源BFS应用'''from collections import dequem, n = map(int, input().split())one_pos = []for i in range(m): s = input() for j in range(n): if s[j] == '1': one_pos.append((i, ..
2020-08-06 01:12:56
272
原创 AcWing A*算法相关问题 179. 八数码
import syssys.stdin = open('data.txt', 'r')from copy import deepcopyfrom queue import PriorityQueuedef arr2grid(arr): return [ [arr[0], arr[1], arr[2]], [arr[3], arr[4], arr[5]], [arr[6], arr[7], arr[8]] ]def distance(grid): m = {1:(0, 0.
2020-08-06 01:11:20
276
原创 AcWing A*算法相关问题 178. 第K短路
import syssys.stdin = open('data.txt', 'r')'''先利用反向边用单元最短路求所有点到终点的最短距离,把这个距离作为预估值做A*,第k次出队列的状态中的距离就是答案'''from typing import List, Tuplefrom queue import PriorityQueueclass DijkStra: # start_node 是单源最短路起点 edges是边的三元组(节点1, 节点2, 边权重) nodes是..
2020-08-06 01:09:55
230
原创 AcWing 状态压缩DP相关问题 1064. 小国王
'''原点加上任意两个点可以确定一条抛物线,先把所有抛物线全部算出来然后计算落到每条抛物线上的点信息,转换成一个区间覆盖问题求解用状态压缩DP解决'''# 计算点是否在抛物线上def is_match(x, y, a, b): val = a* x * x + b * x return abs(val - y) <= 1e-6# 1的数量def one_cnt(val): ans = 0 while val: ans += ..
2020-08-03 14:06:46
204
原创 AcWing 状态压缩DP相关问题 524. 愤怒的小鸟
'''原点加上任意两个点可以确定一条抛物线,先把所有抛物线全部算出来然后计算落到每条抛物线上的点信息,转换成一个区间覆盖问题求解用状态压缩DP解决'''# 计算点是否在抛物线上def is_match(x, y, a, b): val = a* x * x + b * x return abs(val - y) <= 1e-6# 1的数量def one_cnt(val): ans = 0 while val: ans += ..
2020-08-03 14:05:48
1917
原创 AcWing 状态压缩DP相关问题 327. 玉米田
'''状态压缩DP求解'''M, N = map(int, input().split())grid = [0] * Mfor line_idx in range(M): arr = list(map(int, input().split())) for i, val in enumerate(arr): if val == 1: grid[line_idx] |= (1 << i)# dp(i, j) 表示前i行进行放.
2020-08-03 14:04:32
218
原创 AcWing 状态压缩DP相关问题 292. 炮兵阵地
import syssys.stdin = open('data.txt', 'r')from functools import lru_cacheN = int(input())link = {}weight = {}parent = {}for _ in range(N): arr = list( map(int, input().split()) ) link[arr[0]] = arr[3:] weight[arr[0]] = arr[1] ..
2020-08-03 14:03:40
174
原创 AcWing 树形DP相关问题 1077. 皇宫看守
import syssys.stdin = open('data.txt', 'r')from functools import lru_cacheN = int(input())link = {}weight = {}parent = {}for _ in range(N): arr = list( map(int, input().split()) ) link[arr[0]] = arr[3:] weight[arr[0]] = arr[1] ..
2020-08-03 13:54:25
197
原创 AcWing 树形DP相关问题 1075. 数字转换
import syssys.stdin = open('data.txt', 'r')'''树形DP, 树的最长路径的应用, 求一个森林里面所有树的最长路径的最大值'''N = int(input())# 先求所有值的约数factor = {}for i in range(1, N+1): for j in range(2, N // i + 1): # 约数不能是自己,所以从2开始枚举,如果约数可以是自己,从1开始枚举 if i*j not in fact.
2020-08-03 13:52:51
282
原创 AcWing 树形DP相关问题 1074. 二叉苹果树
import syssys.stdin = open('data.txt', 'r')N, Q = map(int, input().split())link = {}for i in range(1, N): a, b, w = map(int, input().split()) if a not in link: link[a] = [] if b not in link: link[b] = [] link[a].a..
2020-08-03 13:51:25
221
原创 AcWing 树形DP相关问题 1073. 树的中心
N = int(input())link = {}for i in range(1, N): a, b, w = map(int, input().split()) if a not in link: link[a] = [] if b not in link: link[b] = [] link[a].append((b, w)) link[b].append((a, w))# 随便选一个节点作为树的根,递归算每个节点到.
2020-08-03 13:50:09
254
原创 AcWing 树形DP相关问题 1072. 树的最长路径
N = int(input())link = {}for i in range(1, N): a, b, w = map(int, input().split()) if a not in link: link[a] = [] if b not in link: link[b] = [] link[a].append((b, w)) link[b].append((a, w))# 随便选一个节点作为树的根,递归算每个节点到.
2020-08-03 13:49:16
214
原创 AcWing 树形DP相关问题 323. 战略游戏
import syssys.stdin = open('data.txt', 'r')'''题目意思本质就是一条边上至少要选一个节点dp(i, j) 表示在以i为根的子树上做放置士兵的选择,在根节点i选择状态是j的情况下所有可能的选择中最少的士兵数量(j 只有0, 1两种选择)'''def dp(i, j, memo): if (i, j) in memo: return memo[(i, j)] if len(link[i]) == 0: .
2020-08-03 13:48:19
182
原创 ACWing 数位DP相关问题 1086. 恨7不成妻
import syssys.stdin = open('data.txt', 'r')MOD = 1000000007# 小于等于n的所有数字的平方和def get_sum(n): if n == 0: return 0, 0, 0 arr = [] val = n while val: arr.append(val % 10) val //= 10 # 前i个位置做选择,选择出的数字要求数位总和模7不等.
2020-08-02 21:23:07
216
原创 AcWing 数位DP相关问题 1085. 不要62
import syssys.stdin = open('data.txt', 'r')def get_num(n): if n <= 0: return 1 # 统一把1算进答案里面,相减就抵消掉了 arr = [] val = n while val: arr.append(val % 10) val //= 10 from functools import lru_cache @lr..
2020-08-02 21:21:25
157
原创 AcWing 数位DP相关问题 1084. 数字游戏 II
import syssys.stdin = open('data.txt', 'r')def get_num(n, N): if n == 0: return 1 arr = [] val = n while val: arr.append(val % 10) val //= 10 # 前i个位置填写数值,所有数值和mod N = mod_val且前前面所有数位都取最大值的标记为all_higher_max.
2020-08-02 21:20:15
208
原创 AcWing 数位DP相关问题 1083. Windy数
import syssys.stdin = open('data.txt', 'r')# 小于等于n的合法的数值个数def get_num(n): if n == 0: return 0 arr = [] val = n while val: arr.append(val % 10) val //= 10 # 前i位做选择,合法的数值个数 # 约束条件:更高的一位选择数值是higher_va...
2020-08-02 21:19:19
304
原创 AcWing 数位DP相关问题 1082. 数字游戏
import sysfrom functools import lru_cachesys.stdin = open('data.txt', 'r')# 小于等于n的符合条件的数字个数def get_num(n): if n == 0: return 1 arr = [] val = n while val: arr.append(val % 10) val //= 10 # 前i位做选择,更高...
2020-08-02 21:18:20
190
原创 AcWing 数位DP相关问题 1081. 度的数量
import syssys.stdin = open('data.txt', 'r')sys.setrecursionlimit(999999)from functools import lru_cache@lru_cache(typed=False, maxsize=128000000)def conbination_num(n, m): if m == n: return 1 if m == 1: return n retu.
2020-08-02 21:16:58
200
原创 AcWing 单调队列优化DP 1091. 理想的正方形
import syssys.stdin = open('data.txt', 'r')'''先按照行求每行每一个滑动窗口中的最大值和最小值然后再纵向求每一列的滑动窗口最大最小值,然后统计每一个最大值最小值二元组的差值的最小值即可'''from collections import dequem, n, k = map(int, input().split())arr = []for i in range(m): arr.append( list(map(int, inp.
2020-08-02 21:14:59
172
原创 AcWing 单调队列优化DP问题 1090. 绿色通道
'''二分搜索可能的空题段的长度,用单调队列优化的DP验证此空题段长度下,能够找到合法的选择方案'''from collections import dequen, t = map(int, input().split())arr = list( map(int, input().split()) )# 验证空题段长度为emp_len,是否有可行方案def valid(emp_len): # dp(i)表示前i个作业中做选择, 最后一个作业做了的情况下,总开销最小值...
2020-08-02 21:13:48
191
原创 AcWing 单调队列优化DP问题 1089. 烽火传递
from collections import dequen, m = map(int, input().split())cost = list( map(int, input().split()) )# dp(i) 表示前i个烽火台进行选择,且最后一个烽火台点燃的所有合法方案中,最小开销的数值# dp(i) = cost(i) + min(dp(i-1), dp(i-2), ... dp(i-m)) 其实dp(i)就依赖于前面长度为m# 滑动窗口中的最小值dp = [0] * nque.
2020-08-02 21:12:36
207
原创 AcWing 单调队列优化DP问题 1088. 旅行问题
import syssys.stdin = open('data.txt', 'r')'''问题做一下转换,把环拆开,组成长度为原来两倍的序列,把每个车站的油量和下一步的距离的差值作为数组元素的数值,对这个长度是2n的数组求前缀和序列,其实题目要求的就是所有长度是n的滑动窗口里面前缀和的最小值和窗口开始位置前面一个前缀和的差值的最小值是不是小于0,如果小于0,说明中间n次移动至少有一次出现了没有油的情况,顺时针和逆时针都做一遍单调队列求滑动窗口最小值的流程,两次结果有一次是成功的,就可以从.
2020-08-02 21:11:11
205
原创 AcWing 单调队列优化DP相关问题 1089. 烽火传递
import syssys.stdin = open('data.txt', 'r')from collections import dequen, m = map(int, input().split())cost = list( map(int, input().split()) )# dp(i) 表示前i个烽火台进行选择,且最后一个烽火台点燃的所有合法方案中,最小开销的数值# dp(i) = cost(i) + min(dp(i-1), dp(i-2), ... dp(i-m)) ..
2020-08-01 14:17:20
191
原创 AcWing 单调队列优化DP相关问题 1088. 旅行问题
import syssys.stdin = open('data.txt', 'r')'''问题做一下转换,把环拆开,组成长度为原来两倍的序列,把每个车站的油量和下一步的距离的差值作为数组元素的数值,对这个长度是2n的数组求前缀和序列,其实题目要求的就是所有长度是n的滑动窗口里面前缀和的最小值和窗口开始位置前面一个前缀和的差值的最小值是不是小于0,如果小于0,说明中间n次移动至少有一次出现了没有油的情况,顺时针和逆时针都做一遍单调队列求滑动窗口最小值的流程,两次结果有一次是成功的,就可以从.
2020-08-01 14:16:18
217
原创 AcWing 单调队列优化DP相关问题 1087. 修剪草坪
import syssys.stdin = open('data.txt', 'r')from collections import dequen, m = map(int, input().split())arr = []for i in range(n): arr.append(int(input()))'''dp(i)表示前i头牛的合法选择中最大总价值的数值用最后一头牛的状态切分状态1. 最后一头牛不选 子集1的最大价值就是dp(i-1)2. 最后一头牛选,以结尾.
2020-08-01 14:15:10
204
原创 AcWing 单调队列优化DP相关问题 135. 最大子序和
import syssys.stdin = open('data.txt', 'r')'''首先求序列的前缀和序列s, 将问题转换一下,以arr[i]结尾的长度不超过m的和最大的连续子序列就是在s[i]前面的m个数中找最小的一个s[k],s[i]-s[k]就是以arr[i]结尾的长度不超过m的和最大的连续子序列的和,其实问题就转换成了单调队列求滑动窗口极值问题'''from collections import dequen, m = map(int, input()....
2020-08-01 14:14:16
206
原创 AcWing 区间DP相关问题 1069. 凸多边形的划分
'''区间DP'''N = int(input())arr = list(map(int, input().split()))from functools import lru_cache# 序号i到j的节点序列的所有划分方案里面权值乘积之和的最小数值@lru_cache(typed=False, maxsize=128000000)def dp(i, j): if j == i + 2: return arr[i] * arr[i + 1] * arr[.
2020-08-01 14:12:46
186
原创 AcWing 区间DP相关问题 1068. 环形石子合并
'''核心思想将原来序列拓展成2倍长度,在拓展区间上做区间DP将环问题转换为线性区间问题'''N = int(input())arr = list(map(int, input().split()))# 把原来的序列拓展成2倍,然后在拓展之后的序列上进行区间DP,把换拆成链arr = arr * 2# dp(i,j)表示从i到j的区间中的石子合并成一个石子的所有方案中最小的开销dp = [[0] * (2*N) for _ in range(2*N)]s = [val .
2020-08-01 14:11:34
161
原创 AcWing 区间DP相关问题 479. 加分二叉树
N = int(input())arr = list(map(int, input().split()))from functools import lru_cache# dp(i, j) 表示所有中序序列是arr[i:j+1]的二叉树的价值的最大值以及最大值对应的树的根节点# 为了让前序序列的字典序最小,价值一样大情况下,根节点选更靠前的@lru_cache(typed=False, maxsize=128000000)def dp(i, j): if j == i: .
2020-08-01 14:10:36
166
原创 ACWing 区间DP相关问题 321. 棋盘分割
'''二维区间DP'''import mathfrom functools import lru_cacheN = int(input())grid = []for _ in range(8): l = list(map(int, input().split())) grid.append(l)pre_sum = [[val for val in grid[i]] for i in range(8)]for i in range(8): for j in .
2020-08-01 14:08:53
256
原创 AcWing 区间DP相关问题 320. 能量项链
'''区间DP问题'''N = int(input())arr = list(map(int, input().split()))# 把圈拆成链条arr = arr * 2from functools import lru_cache# dp(i, j)表示区间i, j中所有计算顺序的选择中,最佳选择对应的最大收益@lru_cache(typed=False, maxsize=128000000)def dp(i, j): if j - i < 2: .
2020-08-01 14:07:27
167
原创 AcWing 区间DP相关问题 282. 石子合并
'''区间DP模板题'''N = int(input())arr = list(map(int, input().split()))# dp(i,j)表示从i到j的区间中的石子合并成一个石子的所有方案中最小的开销dp = [[0] * N for _ in range(N)]s = [val for val in arr]for i in range(1, len(s)): s[i] += s[i - 1]for i in range(N - 1, -1, -1): .
2020-08-01 14:04:50
136
轻松汇编2.7最新版以及修改字体办法
2010-09-13
VisualAssist1827以及破解补丁
2010-09-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人