How many ways?? 【HDU
阿新 • • 發佈:2018-12-10
題目連結
思路:
因為資料比較的小,我就直接想到了開到O(K*N^2)的解法直接DP(15ms),我們要做的就是去詢問K次,每次都更新所有節點,用二維DP分別記錄所抵達的節點,與此時的所走的點的次數,dp[i][j],我用i記錄點、j記錄經過了j步。
完整程式碼:
#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045 using namespace std; typedef long long ll; const int mod=1000; const int maxN=22; int N, M, T, A, B, K; //T次詢問 bool vt[maxN][maxN]; int dp[maxN][maxN]; //第i個點,經過j步 int main() { while(scanf("%d%d", &N, &M)!=EOF) { if(!N && !M) break; memset(vt, false, sizeof(vt)); for(int i=1; i<=M; i++) { int e1, e2; scanf("%d%d", &e1, &e2); vt[e1][e2]=true; } scanf("%d", &T); while(T--) { memset(dp, 0, sizeof(dp)); scanf("%d%d%d", &A, &B, &K); dp[A][0]=1; for(int line=1; line<=K; line++) //一共得走K步 { for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { if(vt[i][j]) { dp[j][line]= (dp[j][line]+dp[i][line-1])%mod; } } } } printf("%d\n", dp[B][K]); } } return 0; }