1843. 津津骑马

MasterKiller

打表过……

10175102262 LarsPendragon

又是一道5EMB+的dp基础题,开心。只需检测对应当前坐标(设为(a,b))的(a-1,b-2)位置和(a-2,b-1)位置即可。
附C++代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int T, dp[31][31]={{0}};
    dp[2][3]=dp[3][2]=1;
    for(int i=3; i<31; i++)
        for(int j=3; j<31; j++)
        {
            dp[i][j]+=dp[i-1][j-2];
            dp[i][j]+=dp[i-2][j-1];
        }
    cin>>T;
    for(int I=0; I<T; I++)
    {
        int a, b;
        cin>>a>>b;
        cout<<"Chessboard #"<<I+1<<':'<<dp[a][b]<<endl;
    }
    return 0;
}
Fifnmar

一道简单的dp,可能因为是冷门所以分高一些?可以打表但是比较麻烦。我不太会元编程一类的黑魔法,所以没法编译期打表了。

下面是程序,把棋盘扩大一圈用作哨兵,可以减少判断的开销。

#include <iostream>
using namespace std;

int t, h, w, board[32][32];

void process() {
    board[2][2] = 1;
    for (int i = 2; i < 32; ++i)
        for (int j = 2; j < 32; ++j)
            board[i][j] += board[i - 1][j - 2] + board[i - 2][j - 1];
    board[2][2] = 0;
}

int main() {
    process();
        cin >> t;
    for (int i = 1; i <= t; ++i) {
        cin >> h >> w;
        printf("Chessboard #%d:%d\n", i, board[h + 1][w + 1]);
    }
}
你当前正在回复 博客/题目
存在问题!