[topcoder]UnsealTheSafe

http://community.topcoder.com/stat?c=problem_statement&pm=4471&rd=10711

这题果然是道简单题,图+DP。拿道题便觉得可以用邻接表表示,然后想要找所有的,是不是要BFS,DFS搜索/遍历?又觉得到过的节点又能回去不好算。忽然间想到每个节点都来自旁边的节点,这样就有阶段了,马上出来状态转移方程,DP得解。

public class UnsealTheSafe

{

    public long countPasswords(int N)

    {

        int[][] G = new int[10][];

        G[0] = new int[]{7};

        G[1] = new int[]{2, 4};

        G[2] = new int[]{1, 3, 5};

        G[3] = new int[]{2, 6};

        G[4] = new int[]{1, 5, 7};

        G[5] = new int[]{2, 4, 6, 8};

        G[6] = new int[]{3, 5, 9};

        G[7] = new int[]{4, 8, 0};

        G[8] = new int[]{5, 7, 9};

        G[9] = new int[]{6, 8};

        

        long[][] DP = new long[10][30];

        for (int i = 0; i < 10; i++)

        {

            DP[i][1] = 1;

        }

        for (int i = 2; i <= N; i++)

        {

            for (int j = 0; j < 10; j++)

            {

                for (int k = 0; k < G[j].length; k++)

                {

                    DP[j][i] += DP[G[j][k]][i-1];

                }

            }

        }

        long sum = 0;

        for (int i = 0; i < 10; i++)

        {

            sum += DP[i][N];

        }

        return sum;

    }

}

  

你可能感兴趣的:(topcoder)