日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【DP】小明游天界(zjoj 2149)

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。