题解 | #数字序列第n位的值#
循环汉诺塔
http://www.nowcoder.com/practice/cdf0808f841748faba058c8ef538c731
动态规划
-
确定状态,记所有盘子移动从移动到状态为0,从移动到状态为1;
-
第步的状态为、, 表示为所有盘子移动到所需要的次数, 表示为所有盘子移动到所需要的次数。
-
第个盘子可以移动到时只需要移动1次,前个盘子一定全部都在上, 并且接下来要将上的所有盘子移动到上,此时所需要移动次数等同于将前个盘子从移动到上,因此此时的状态转移为:
-
由此类推,所有盘子移动到时,一定是第个盘子先移动到之后,再移动到,即需要步,而第个盘子移动到时,前个盘子一定全部都在上,移动次数为,且第个盘子要移动到时,前个盘子一定要移动到上,此时移动步数等价于将个盘子从移动到的步数,即,当第个盘子移动到之后,又要将前个盘子从移动到上。 因此此时的状态转移为:
即:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll dp[10000005][2];
int n;
int main(){
cin>>n;
dp[1][0] = 1;dp[2][0] = 5;
dp[1][1] = 2;dp[2][1] = 7;
for(int i = 3; i <= n; ++i){
dp[i][0] = (1 + dp[i-1][1] * 2) % mod;
dp[i][1] = (2 + dp[i-1][1] * 2 + dp[i-1][0]) % mod;
}
cout<<dp[n][0]<<' '<<dp[n][1]<<endl;
return 0;
}