2021-03-06アリババ春の採用実践筆記試験アルゴリズム質問記録

トピック1

参照はボタン1411のままである可能性があります
タイトル説明

Xiao Mingは現在、3種類のデジタルカードを手にしています。カードの番号は1、2、3です。3種類のデジタルカードにはそれぞれ複数のカードがあります。彼はこれらの番号をN *の正方形に入れたいと考えています。 3.各正方形に配置できるカードは1枚のみであり、隣接する上下左右の正方形に同じ数のカードを配置できないようにする必要があります。次に、可能な配置オプションの数を尋ねます。

説明を入力してください:

各ファイル入力の最初の行に整数T(1 <= T <= 500)を入力します。これは、テストデータのTグループがあることを意味します。
次のTグループには、整数n(1 <= n <= 100000)を入力します。 )各グループ用。

出力の説明:

テストデータのセットごとに、可能な解決策の数を表す回答を出力します。回答は非常に大きいため、残りの10 ^ 9 +7を取得してください。

例1:

入力:
2
1
2
出力:
12
54

説明:

サンプルの最初のグループについて、1 * 3グリッドに配置します。可能な解決策は、(1,2,1)、(2,1,2)、(3,1,2)、(1,2 、3)、(2,1,3)、(3,1,3)、(1,3,1)、(2,3,1)、(3,2,1)、(1,3,2 )、(2,3,2)、(3,2,3)


最初にコードを書く

import java.util.Scanner;

public class Main {
    
    
    private static long[][] dp = new long[10001][2];
    private static int now = 1;
    public static void main(String[] args) {
    
    
        dp[1][0] = 6L;
        dp[1][1] = 6L;
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for(int i = 0 ; i < t ; i++){
    
    
            int n = sc.nextInt();
            if(n<=now){
    
    
                long res = (dp[n][0] + dp[n][1])%1000000007;
                int realRes = (int) res;
                System.out.println(realRes);
            } else {
    
    
                for(int j = now+1 ; j <= n ; j++){
    
    
                    dp[j][0] = (dp[j-1][0]*3 + dp[j-1][1]*2)%1000000007;
                    dp[j][1] = (dp[j-1][0]*2 + dp[j-1][1]*2)%1000000007;
                }
                long res = (dp[n][0] + dp[n][1])%1000000007;
                int realRes = (int) res;
                System.out.println(realRes);
                now = n;
            }
        }
    }
}

問題解決のアイデア

最初のアイデアは、dfsを使用して実行することですが、タイムアウトする必要があります。上記は、回答が大きい可能性があることも示唆しているため、dfsを1つずつカウントしないでください。

タイトルのサンプル入力を注意深く分析すると、2 * 3の正方形の計画が1 * 3の正方形の計画から拡張されるようなルールを見つけることができます!つまり、n * 3の問題の場合、n-1 * 3の解に基づいて各解の最後の行を考慮するだけで済みます

プログラムの各行について、2つのカテゴリに分類できます。
最初のカテゴリ:(1,2,1)、(2,1,2)、(3,1,3)、(1,3、1)、 (2,3,2)、(3,2,3)。このタイプをABAと呼びます;
2番目のタイプ:(3,1,2)、(1,2,3)、(2,1,3)、(2,3,1)、(3,2、1)、 (1,3,2)。このタイプをABCと呼びます

前の行と次の行の関係を導き出しましょう

  1. 前の行がABAの場合、次の行には5つの可能性があります。つまり、(C、A、C)、(B、A、B)、(B、C、B)、(B、A、C)、 (タクシー)。これらの5つのスキームは、実際には3種類のABAと2種類のABCです。

  2. 前の行が(A、B、C)の場合、次の行には(B、A、B)、(B、C、B)、(B、C、A)、(C、A)の4つの可能性があります。 、B)。そして、これらの4つのプログラムは、実際には2種類のABAと2種類のABCです。

したがって、n * 3の問題はf(n)であり、ABAスキームの数はXnであり、ABCスキームの数はYnであると仮定します。

その場合、漸化式は次のようになります
。f(n + 1)= Xn + 1 + Yn + 1;
Xn + 1 = 3Xn + 2Yn;
Yn + 1 = 2Xn + 2Yn;

最後に、メモdpを使用して、以前に計算された問題を記録し、二重計算を防ぎ、時間効率を向上させることができます。
オーバーフローを防ぐために、作成者はlong型を使用して計算し、すべての場所で剰余演算を実行します(必須ではありません)。


トピック2

2番目の質問はグラフ理論についてです。


総括する

一般的に言って、アリの筆記試験問題の難易度は低くなく、質問の種類はCCFやACMの競争問題に似ており、リコウの問題と同じスタイルではありません。以前は、質問をブラッシュアップするためにLikouを使用しただけでしたが、Likouはアルゴリズムの問​​題の問題解決の考え方しか実行できないと感じています。試験の前にプログラミング環境に精通することが重要です。そうしないと、入力の処理に長い時間がかかります。問題を解決するために最善を尽くしてこの時間を費やすことをお勧めします。そもそもそれをしないでください。それができない場合は、後で行ってください。できない可能性が高いです。両方の問題を実行します(Daniuはおそらく私のブログを読まないでしょう。QAQ)。

結局、質問を1つもしなくても構いません。アリの筆記試験と品質評価は参考になりそうですが、できない場合は面接に入る機会があります。面接の準備をしなさい!皆様の早期のご提案をお祈りしております。いい加減にして!

ps。インタビューについて質問がある場合は、以下にメッセージを残すか、アリの紹介方法が必要な場合は私に連絡してください。

おすすめ

転載: blog.csdn.net/weixin_43905212/article/details/114454963