小明游天界
题目大意:
有 m个单位时间,让你从1走到n(不能早到,不能晚到),要使经过的城市最多,若无法用m个单位时间到达n就输出-1
样例输入
5 12 4
1 2 5
1 4 3
4 2 4
2 5 5
样例输出
4
数据范围限制
对于30%的数据,1≤n≤50,m≤1≤t≤100
对于100%的数据,1≤n≤1000,0≤m≤1000,1≤t≤50000,且每个景点到其他景点的道路不超过1000条
解题思路:
这道题我一开始想到了可以用DP做,但只想到了用三重循环的方法,后来经大佬一指点,就想到了两重循环的方法,因为用f[i][j]来表示到i地用了j时间的最大浏览景点个数,他只和j-1有关,只要用j做最大的循环就可以免去一重循环了
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,t,x[50005],y[50005],z[50005],f[1005][1005];
int main()
{scanf("%d %d %d",&n,&m,&t);for (int i=1;i<=t;i++)scanf("%d %d %d",&x[i],&y[i],&z[i]);f[1][0]=1;for (int i=0;i<=m;i++)for (int j=1;j<=t;j++){if ((i+z[j]<=m)&&(f[x[j]][i])) f[y[j]][i+z[j]]=max(f[y[j]][i+z[j]],f[x[j]][i]+1);if ((i+z[j]<=m)&&(f[y[j]][i])) f[x[j]][i+z[j]]=max(f[x[j]][i+z[j]],f[y[j]][i]+1);}if (!f[n][m]) printf("-1");else printf("%d",f[n][m]);return 0;
}