牛客oi測試賽 二 B 路徑數量
阿新 • • 發佈:2018-09-08
clu clipboard 我們 style coder 輸入 之間 boa for
A[i][j]=1表示i號點和j號點之間有長度為1的邊直接相連.
求出從 1 號點 到 n 號點長度為k的路徑的數目. 首先我想的是搜索,但是很明顯會TLE,我們看這個數據範圍只有30,一般數據範圍比較小,搜索T了的情況,我們就使用dp
現在我們想下怎麽得到我們想要的遞推式呢
我們列出題目的要求
1.可以重復走
2.正好走k步
因為我們每一點都有不同的步數
例如:
題目描述
給出一個 n * n 的鄰接矩陣A. A是一個01矩陣 .A[i][j]=1表示i號點和j號點之間有長度為1的邊直接相連.
求出從 1 號點 到 n 號點長度為k的路徑的數目.
輸入描述:
第1行兩個數n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10)
第2行至第n+1行,為一個鄰接矩陣
輸出描述:
題目中所求的數目示例1
輸入
復制4 2 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
輸出
復制2
說明
樣例如圖: 第一條路徑:1-2-4 第二條路徑:1-3-4 題意:求出這個圖的1-n走正好k步的路徑條數,點可以重復走 思路:1-2 1-2-3-2
到2的步數都是不同的
所以我們要枚舉步數的情況
#include<cstdio> #include<cstring> int a[50][50]; long long f[50][50]; int main() { f[1][0]=1; int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&a[i][j]); for(int i=1;i<=k;++i) for(int j=1;j<=n;++j) for(int t=1;t<=n;++t) if(a[j][t])//如果 j到t 有一條路 如果當前我們走到j點是x步,那麽我們只要把t點的x+1步的值加上當前的j點的值即可 f[t][i]+=f[j][i-1]; printf("%lld\n",f[n][k]); return 0; }
牛客oi測試賽 二 B 路徑數量