CSP2023-J T4 求助
查看原帖
CSP2023-J T4 求助
961827
Tang_poetry_syndrome楼主2023/10/23 13:44

rt,55pts,TLE
写了个记忆化搜索,在同一个位置,如果时间为 t1t_1 时可走出景区,那么 t2(t1≡t2(modk))t_2(t_1\equiv t_2 \pmod{k}),dpx,t%kdp_{x,t\%k} 代表在位置为 xx 时 t%kt\%k 的最优解。
下面是我的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,j,k) for(register ll i=j;i<=k;i++)
#define pb push_back
const int N=2e4+10,mod=1e9+7;
ll n,m,k,u,v,a,dp[N][105],bst[N][105],maxx,ans=INT_MAX;
bool flag=false;
vector<pair<ll,ll> >g[N];
void dfs(ll x,ll t)//第x个景点,时间为t 
{
	if(t>=dp[x][t%k]||t>=bst[x][t%k])return;
	dp[x][t%k]=t;
	if(x==n||g[x].empty())return;
	f(i,0,g[x].size()-1)
		if(t>=g[x][i].second)dfs(g[x][i].first,t+1);
}
int main()
{
    //freopen("bus.in","r",stdin);
    //freopen("bus.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	f(i,1,m)cin>>u>>v>>a,g[u].pb(make_pair(v,a)),maxx=max(maxx,a);
	memset(bst,0x3f3f3f3f,sizeof(bst));
	f(i,0,maxx/k)
	{
		memset(dp,0x3f3f3f3f,sizeof(dp));
	//	if(dp[n][0]==0x3f3f3f3f&&!flag)
	//	else flag=true;
		//f(i,1,n)f(j,0,k)dp[i][j]=0x3f3f3f3f;
		dfs(1,i*k);
		if(dp[n][0]!=4557430888798830399)f(j,1,n)f(l,0,k-1)bst[j][l]=min(bst[j][l],dp[j][l]);
	}
	ans=bst[n][0];
	if(ans!=4557430888798830399&&ans!=LONG_LONG_MAX)cout<<ans;
	else cout<<-1;
	return 0;
}
2023/10/23 13:44
加载中...