算法题(关键词:房间传送,动态规划)

本文介绍了如何使用动态规划策略解决一个算法问题,该问题涉及在具有特定传送门规则的n+1个房间中移动。通过分析移动策略,确定了动态规划的状态转移方程,并给出了相应的JavaScript代码实现。注意在计算过程中可能出现负数结果,需要对模运算后的结果进行调整。
摘要由CSDN通过智能技术生成

算法题
存在n+1个房间,每个房间依次为房间1 2 3…i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:
A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1;
B. 如果访问过当前房间 i 奇数次,那么移动到房间pi;
现在路人甲想知道移动到房间n+1一共需要多少次移动;

根据题目,可以发现跳转到第i+1个房间所最终需要的次数依赖于跳转到第i个房间所需要的次数,可以考虑用动态规划的方法解决。
假设dp[i]是跳转到第i个房间所需的次数。我们的最终目标就是求dp[i]。
首先我们可以从简单的角度入手,即不考虑策略B的情况,当到达第i-1个房间,无需跳转到pi-1房间,那么dp[i] = dp[i-1]+1
此时我们再引入新的变量,即策略B的情况。由题可知,1<=pi-1<=i-1,那么从第pi-1个房间到达第i个房间所需的次数为dp[i-1]-dp[pi-1]+1(实际上这样就可以同时兼顾pi-1=i-1和pi-1≠i-1两种情况)
综上所述,最终得出dp[i]=(dp[i-1]+1)+(dp[i-1]-dp[pi-1]+1)=2*dp[i-1]-dp[pi-1]+2

实现代码如下:

var num = readline().split(' ').map(item=>parseInt(item));
var line;
var arr = [];
while(line=readline()){
    var re = line.split(' ').map(item=>parseInt(item));
    for(let i=0;i<re.length;i++){
        arr.push(re[i]);
    }
}


function jumpRoom(num,arr){
    
    var dp = new Array(num+1).fill(0);
    dp[1] = 0;
    for(let i=2;i<=num+1;i++){
        dp[i] = (2*(dp[i-1])-dp[arr[i-2]]+2)%1000000007
    }
    return dp[num+1]<0?dp[num+1]+1000000007:dp[num+1];
}
console.log(jumpRoom(num[0],arr));

这里需要注意一个问题:直接输出dp[num+1]的结果,有可能会出现负数(是因为题目要求对结果用10e9+7取模,将结果控制在一定取值范围内,导致原本比较大的数值因为取模反而变小,被减数小于减数,结果出现负数)。因此在最终结果需要再加回10e9+7

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值