标签:位置 target int 机器人 rest current process1 动态 走路
题目描述
假设有排成一行的N个位置,记为1~N,(N>=2),开始时机器人在start位置,有如下约束
- 机器人在1位置,下一步只能走到2位置
- 机器人在N位置,下一步只能走到N-1位置
- 机器人在其他位置,下一步能走左边,也能走右边
求机器人从start位置经过k步到达target位置的方法数。
思路
base-case是当机器人没有步数可走时,若current位置等于target位置,则方法数+1,在加上题目给定的边界的限制条件。
优化思路:可以看出决定函数返回值的是current,rest,可以建立二维表来存储返回值,在第二次遇到时直接取值
而题目所要求得可以直接根据表来得到,依据初始化条件和函数间的依赖可以直接得到结果。可以看出在填表的过程中和原题意基本没有关系,只是根据递归函数来填表。
求解
#include <iostream>
using namespace std;
//现在在current位置,还有rest步要走,到target的方法数
int process1(int N, int current, int rest, int target);
int processdp(int N, int current, int rest, int target, int **dp);
int processdp2(int N, int current, int rest, int target);
int main() {
cout << process1(6,3,5,6) << endl;
int N = 6, K = 5;
int dp[N+1][K+1];
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= K; j++) {
dp[i][j] = -1;
}
}
cout << processdp(6,3,5,6,(int**)dp) << endl;
cout << processdp2(6,3,5,6) << endl;
return 0;
}
//暴力递归
int process1(int N, int current, int rest, int target) {
if(rest == 0) {//已经没有步数要走
return (current == target) ? 1 : 0;//?:表达式
} else if(current == 1) {//1->2位置
return process1(N, 2, rest - 1, target);
} else if(current == N) {//N->N-1位置
return process1(N, N-1, rest - 1, target);
} else {//中间位置
return process1(N, current-1, rest - 1, target) + process1(N, current+1, rest-1, target);
}
}
//缓存方法
int processdp(int N, int current, int rest, int target, int **dp) {
int res;
if(dp[current][rest] != -1) { //不等于-1,已经算过,直接返回
return dp[current][rest];
}
if(rest == 0) {//已经没有步数要走
res = (current == target) ? 1 : 0;//?:表达式
} else if(current == 1) {
res = process1(N, 2, rest - 1, target);
} else if(current == N) {
res = process1(N, N-1, rest - 1, target);
} else {
res = process1(N, current-1, rest - 1, target) + process1(N, current+1, rest-1, target);
}
dp[current][rest] = res;
return res;
}
//填表
int processdp2(int N, int current, int rest, int target) {
int dp[N+1][rest+1];
for(int i = 0; i <= N; i++) {
for(int j = 0; j <=rest; j++) {
dp[i][j] = 0;
}
}
dp[target][0] = 1;
for(int j = 1; j <= rest; j++) {
dp[1][j] = dp[2][j-1];
for(int i = 2; i < N; i++) {
dp[i][j] = dp[i-1][j-1] + dp[i+1][j-1];
}
dp[N][j] = dp[N-1][j];
}
return dp[current][rest];
}
标签:位置,target,int,机器人,rest,current,process1,动态,走路 来源: https://www.cnblogs.com/sakuzeng/p/16469056.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。