[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;
    }
}

  

原文地址:https://www.cnblogs.com/lautsie/p/3349817.html