【題解】ZeroJudge b229: TOI2009 第一題:路徑問題

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=b229
【解題想法】觀察sample input,滾動DP

  • 第一步可以往上、左、右走。
  • 前一步往上走:這一步可以往上、左、右走。
  • 前一步往左走:這一步可以往上、左走。
  • 前一步往右走:這一步可以往上、右走。
#include <iostream>
using namespace std;

unsigned long long n, a, b, c, d;

int main() {
    cin >> n;
    a = 1;
    b = 1;
    for (int i = 1; i < n; i++){
        c = a + b * 2;
        d = a + b;
        a = c;
        b = d;
    }
    cout << a + b*2 << "\n";
}
#include <iostream>
using namespace std;

unsigned long long n;
unsigned long long dp[2][3];

int main() {
    cin >> n;
    dp[1][0] = 1; //up
    dp[1][1] = 1; //left
    dp[1][2] = 1; //right
    int idx = 1;
    for (int i=2; i<=n; i++){
        idx = i % 2;
        dp[idx][0] = dp[idx^1][0] + dp[idx^1][1] + dp[idx^1][2];
        dp[idx][1] = dp[idx^1][0] + dp[idx^1][1];
        dp[idx][2] = dp[idx^1][0] + dp[idx^1][2];
    }
    cout << dp[idx][0] + dp[idx][1] + dp[idx][2] << '\n';
}
分享本文 Share with friends