Day4 还是比较简单的
C.Journey
有一个DAG,边上有权值,共有n个点和m条边你一共有T的体力,现在从1出发到点n,经过一条边,花费体力值为这条边的边权,现在你要在体力允许的情况下到达n点并尽可能经过最多的点,求出经过点的数量和路线
DAG上dp,开始读错题了。。。以为终点随意。后来以为dfs遍历一下就ok,后来发现并不是,会爆掉(这是真的蠢) d p / i , j dp/_{i,j} dp/i,j表示在点 i i i处距离 n n n的最大深度为 j j j时需要的最小花费,则有: d p n o w , i = m i n ( d p n o w , i , d p t o , i − 1 + d i s ( n o w , t o ) ) dp_{now,i}=min(dp_{now,i},dp_{to,i-1}+dis(now,to)) dpnow,i=min(dpnow,i,dpto,i−1+dis(now,to))
当 d p n o w , i dp_{now,i} dpnow,i发生更新的时候,更新一下路径 p a t h n o w , i = t o path_{now,i}=to pathnow,i=to
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int maxn=5e3+5;
const int inf=1e9+9;
vector<pii>G[maxn];
int dp[maxn][maxn];<