摘要:
题目链接 题解 ⭐:有环图上的dp很可能需要多次转移,只得使用类SPFA而非Dijkstra算法 $d$数组Dijkstra预处理即可。然后建反向图,dp。 状态:$dp[i][j]$表示第i个节点是否(\(j=1/0\))已使用2操作时的答案。 转移方程: \[ dp[v][0]=min(dp[v 阅读全文
摘要:
题目链接 题解 如果$M>A+R$的话(可能还要加上些奇奇怪怪的条件,总之就是全部弄成$M$最优的情况),把高度变为平均数一定最优,这样可以最大化使用$M$。如果$M$没有太大用处,而是要在$A,R$之间找平衡的话,可以发现最终高度一定为某个柱子的高度。简单证明:将$h$数组升序排序,设$h_i<r 阅读全文
摘要:
题目链接 题解 ⭐:在有规律的矩阵中求最大值,可以考虑使用类最短路的搜索。 易得答案为$k$个格子覆盖次数和$\div (n-r+1)^2$,因此只需找出覆盖次数最大的$k$个格子。所以——打表找规律! 格子$(tx,ty)$被覆盖的次数如下:设$x=min(tx,n-tx+1),y=min(ty, 阅读全文
摘要:
题目链接 题解 ⭐:$inf$若需多次加减不宜过大,容易溢出。 dp题呐~ 状态:$dp[i][j]$表示前$i$轮距离上次(包括当前卡牌)触发双倍已经经过$j$张卡时的最大伤害。 初始值:\(dp[i][j]=inf,dp[i][0]=0\quad (0\le i\le n,1\le j\le 9 阅读全文
摘要:
题目链接 题解 仅在easy version上增加单调队列优化即可,简单版题解。但注意为使单调队列中数据为之前卡牌,需要倒序转移(与01背包滚动数组相似)。 AC代码 #include<bits/stdc++.h> #define int long long using namespace std; 阅读全文
摘要:
题目链接 题解 dp+双指针,时间复杂度为$O(n)$。 状态:\(dp[i]\):当前最右区间结尾为$i$时是/否(\(1/0\))可行。 初始值:\(dp[0]=1,dp[i]=0\quad(1\le i\le n)\) 转移方程:将$a$数组升序排序,设$dp[i-1]$由$dp[lst]$转 阅读全文
摘要:
题目链接 题解 $O(\sqrt n)$竟然能过!暴力的胜利 利用贪心思想,我们希望最大的城堡最高,这样总塔数最小。但是高堡需要比它低的城堡做铺垫,因此总趋势应该是先单调不降后单调不升(至少我们可以将之摆放成这样)。也就是设最高值为$sum$,一排城堡应如此:\(\{n,n+1,...,sum(,s 阅读全文
摘要:
题目链接 题解 可以发现结尾只得为$00,25,50,75$,因此枚举这些数字将其放至结尾即可。若将$n$由右至左从$1$开始编号,将数字$a_i$移至末尾所需操作数为$i-1$。此外,若数对$00,25,50,75$的顺序是正确的,操作数须$-1$;若存在前缀0,需要增加前缀0个数的操作数。设$n 阅读全文
摘要:
题目链接 题解 ⭐:①记忆化搜索的时间复杂度为状态数$\times$决策数 ②记忆化搜索(dfs)为博弈论题目常见解法 记忆化搜索,$ans[i][j]\(表示当前轮在点\)(i,j)$上玩家的输/赢(\(0/1\))。只要当前可以转移到的状态中有一个为赢,则当前状态为输(因为玩家极聪明)。Tips 阅读全文
摘要:
题目链接 题解 ⭐:为保证无后效性可以尝试倒序 如果下一个盒子会猜中,便在当前盒子中停留,如此可见对于每一个起始位置,可以到达的最终位置是连续的,因此可以求出其左右端点。设娃娃要由$i$号盒子转移至$j$号盒子中(\(i<j\)),可以发现在某处停留一次与由$i-1$号盒子出发产生的后果相同,因此最 阅读全文