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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

动态规划训练13 [Catch That Cow poj3278]

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划训练13 [Catch That Cow poj3278] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Catch That Cow

? POJ - 3278?


這道題我看大家用的方法都是bfs搜索,為什么在我看來這就是一個動態規劃的題目啊啊啊啊啊啊啊

dp[x]表示從N出發到x所需要的最小時間

那么得到如下轉移方程

如果x < N的話,那么只能通過走路來轉移,所以dp[x] = N - x,x <= N時候

而x > N時候,可以通過2種方式來轉移

(1)走路轉移 dp[x] = dp[x-1] + 1

(2)跳躍加走路轉移

當x為偶數的時候

dp[x] = min(dp[x],dp[x/2]+1,dp[x/2+1]+3)

當x為奇數的時候

dp[x] = min(dp[x],dp[(x-1)/2]+2,dp[(x+1)/2]+2)


代碼:

#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int N,K; const int MAX = 100005; int dp[MAX];int main(){cin>>N>>K;for(int i = 0;i <= K;i++){dp[i] = abs((int)(N - i));}for(int i = N+1;i <= K;i++){if(i & 1) // 奇數{dp[i] = min(dp[i],dp[(i-1)/2]+2);dp[i] = min(dp[i],dp[i-1]+1);dp[i] = min(dp[i],dp[(i+1)/2]+2);} else{dp[i] = min(dp[i],dp[i/2]+1);dp[i] = min(dp[i],dp[i-1]+1);dp[i] = min(dp[i],dp[i/2 + 1]+3);}}cout<<dp[K]<<endl;return 0; }


補充:剛才嘗試了一下模擬的方法,確實也行的通,而且代碼量不大

#include <iostream> #include <cstdio> #include <queue> using namespace std; typedef pair<int,int> P; const int MAX = 200005;? int used[MAX]; int main(){ int N,K; cin>>N>>K; queue<P> Q; Q.push(make_pair(0,N)); while(!Q.empty()){ P p = Q.front();Q.pop(); if(p.second == K){ cout<<p.first<<endl; break; } if(p.second <= K + 2 ?&& !used[p.second + 1]){ Q.push(make_pair(p.first+1,p.second + 1)); used[p.second + 1] = 1; } if(p.second >= 1 && !used[p.second - 1]){ Q.push(make_pair(p.first+1,p.second - 1)); used[p.second - 1] = 1; } if(p.second * 2 <= 2* K ?&& !used[p.second * 2]){ Q.push(make_pair(p.first+1,p.second * 2)); used[p.second * 2] = 1; } } return 0; }

總結

以上是生活随笔為你收集整理的动态规划训练13 [Catch That Cow poj3278]的全部內容,希望文章能夠幫你解決所遇到的問題。

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