1. 程式人生 > >牛客oi測試賽 二 B 路徑數量

牛客oi測試賽 二 B 路徑數量

clu clipboard 我們 style coder 輸入 之間 boa for

題目描述

給出一個 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步的路徑條數,點可以重復走 思路:
首先我想的是搜索,但是很明顯會TLE,我們看這個數據範圍只有30,一般數據範圍比較小,搜索T了的情況,我們就使用dp 現在我們想下怎麽得到我們想要的遞推式呢 我們列出題目的要求 1.可以重復走 2.正好走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 路徑數量