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