摘要:
用$f(i,j)$表示子序列$a_i$和$b_i$的最长公共子序列的长度 当$a_i = b_i$时,找出$a_$和$b_$的最长公共子序列,然后在其尾部加上$a_i$即可得到$a$和$b$的最长公共子序列。 当$a_i ≠ b_i$时,求解两个子问题: 求$a_$和$b_i$的最长公共子序列 求$ 阅读全文
摘要:
解法一 第一步:确定状态——原问题?子问题? \(f[i]\) 前$i$个数的最长不下降子序列——求不了啊~为什么求不了? 不知道这个序列的最后一个元素是哪个,没法转移 $f[i]$以第$i$个数为结尾的最长不下降子序列 第二步:确定状态转移方程 \(f[i]=max\{f[j]+1\}(a[j]< 阅读全文
摘要:
三维$bfs$模板 const int N=110; struct Node { int x,y,z; }; char g[N][N][N]; int dist[N][N][N]; int n; inline bool check(int x,int y,int z) { return x>=0 & 阅读全文
摘要:
$bfs$裸题,加两个$bool$变量判断下一步是否能继续走就好了 const int N=1010; char g[N][N]; int dist[N][N]; struct Node { int x,y; bool F,M; }; PII ed; int n,m; inline bool che 阅读全文
摘要:
$bfs$裸题,注意读入 const int N=510; char g[N][N]; int dist[N][N]; PII st,ed; int n,m; inline bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<m; } 阅读全文
摘要:
一眼二分。。。然后就没思路了。。。 二分当前路径上第$k+1$大的边权,要求最小化第$k+1$大的边权,故考虑二分。 二分的判定条件是当前路径上边权比$mid$大的边数应不超过$k$条 于是现在核心问题是如何当前二分的值为$mid$的情况下,是否存在一条从$1$到$n$的路径,边权大于$mid$的边 阅读全文
摘要:
枚举访问$5$个亲戚顺序的全排列 有了全排列后,现在缺少每个亲戚到其他亲戚的最短距离 于是跑$6$次$dijkstra$算法 const int N=50010; vector<PII> g[N]; int dist[10][N]; bool vis[N]; int sta[10]; bool st 阅读全文
摘要:
建图方式非常像P1194 买礼物,感觉点权都可以转化到虚拟源点到各个点的边权上。 若不考虑等级关系 等价于求虚拟源点到$1$号点的最短路。 若考虑等级关系 考虑枚举。因为必定和酋长交易,那么整个交换过程可取的就是酋长的等级-m到酋长的等级+m。并且每次交易方案中,最小与最大的等级差不超过m。所以可以 阅读全文
摘要:
这不是暑假做的建模题吗。。。 $g[i][j]$为不考虑换乘情况下$i->j$的最短距离(依题意显然为0) 再跑$dijkstra$判断换乘情况下$1$号点到$n$号点的最短距离 const int N=510; int g[N][N]; int dist[N]; bool vis[N]; int 阅读全文
摘要:
毒瘤题。。。卡了好久 本题求乘积最大的路径,咋一看好像是最长路直接无脑跑$spfa$,事实上$spfa$的确能跑过。 但本题也可以用$dijkstra$求解,原因是边权有特殊的性质:$0<w<1$ 这就导致了如果$s->...->t->...>e$是$s$到$e$乘积最大的路径,那么$s->...- 阅读全文