动态规划训练13 [Catch That Cow poj3278]
2017-06-22 23:02
316 查看
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;
}
相关文章推荐
- 动态规划专题训练:(全部是紫书上的题——做到吐)
- 动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]
- 动态规划训练5 [回文词]
- 动态规划专项训练(2)
- 合并类动态规划专题训练
- 动态规划训练6 [统计单词个数]
- 动态规划训练9 [Brackets POJ - 2955 ]
- 蓝桥杯 ALGO-21算法训练 装箱问题(动态规划,01背包)
- 华为训练题目:初级——合唱队(递增子序列,DP动态规划问题)
- 动态规划专题训练
- 100道动态规划——13 UVA 10163 Storage Keepers 有约束条件下的DP,递推,不能使用结构体作为基本单位
- 动态规划13之1018
- 蓝桥杯训练:动态规划——没有上司的晚会
- 2014专题训练之动态规划总结
- 区间合并类动态规划训练
- 蓝桥杯训练:动态规划——0-1背包
- 动态规划训练15 [Monkey and Banana HDU - 1069 ]
- 动态规划训练16 [Doing Homework HDU - 1074 ]
- DAG 上的动态规划(训练指南—大白书)
- 蓝桥杯训练:动态规划——最长上升子序列