動的計画法の勉強過程で、c++で書かれたコードを参考にpythonを使って書いてみました。
しかし、同じような結果になりません。
配列の使い方が少し違いますが、同じような動きをするはずと思って書いたのですが、うまくいかず、間違っているところもわかりません。pythonのコードのどこが間違っているのでしょうか?
以下、問題はAtcoderのサイトからの転記です。
問題文
N段の階段があります。高橋君は現在、上り口(0段目)にいます。 高橋君は一歩で 1段か2段上ることができます。
ただし、a1,a2,a3,....aM段目の床は壊れており、その段に足を踏み入れることは危険です。
壊れている床を踏まないようにしながら、最上段(N段目)にたどりつくまでの移動方法は何通りあるでしょうか? 総数を
1,000,000,007で割った余りを求めてください。
制約
1≦N≦10^5
0≦M≦N−1
1≦a1<a2<...<aM≦N−1
入力例
6 1
3
出力例
4
C++
1//正解 2#include <iostream> 3#include <vector> 4using namespace std; 5const int MOD = 1000000007; 6 7int N, M; 8vector<bool> issafe; 9 10int main() { 11 cin >> N >> M; 12 issafe.assign(N+1, true); 13 for (int i = 0; i < M; ++i) { 14 int a; cin >> a; 15 issafe[a] = false; 16 } 17 18 vector<int> dp(N+1, 0); 19 20 dp[0] = 1; 21 if (issafe[1]) dp[1] = 1; 22 23 for (int n = 2; n <= N; ++n) { 24 if (issafe[n-1]) dp[n] += dp[n-1]; 25 if (issafe[n-2]) dp[n] += dp[n-2]; 26 dp[n] %= MOD; 27 } 28 cout << dp[N] << endl; 29}
Pyhton
1###以下がうまくいかないコードです。 2n, m = map(int, input().split()) 3a = [] 4[a.append(int(input())) for _ in range(m)] 5 6dp = [0] * 10000 7dp[0] = 0 8if 1 not in a: 9 dp[1] = 1 10 11for i in range(2, n + 1): 12 if (i - 1) not in a: 13 dp[i] = dp[i] + dp[i - 1] 14 if (i - 2) not in a: 15 dp[i] = dp[i - 2] + dp[i] 16 17 dp[i] %= 1000000007 18 19print(dp[n])
回答2件
あなたの回答
tips
プレビュー