【DP】小明游天界(zjoj 2149)
生活随笔
收集整理的這篇文章主要介紹了
【DP】小明游天界(zjoj 2149)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小明游天界
題目大意:
有 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);//由x延伸到yif ((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);//由y延伸到x}if (!f[n][m]) printf("-1");//判斷是否有數else printf("%d",f[n][m]);//輸出return 0; }總結
以上是生活随笔為你收集整理的【DP】小明游天界(zjoj 2149)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【背包】小明逛超市(jzoj 2148)
- 下一篇: 预防电脑死机的几种方法电脑如何防止死机