題目描述
在乙個n*n的矩陣中,每個格仔都有乙個整數,pipi位於矩陣的左上角,它想知道有多少條不同合法路線達到矩陣右下角。
行走規則如下:
(1)每次只能往下或往右走一步。
(2)格仔中的整數表示從該點出發一步必須跨越的距離。
ps:對(1)和(2)條件的解釋: 若此時在 (x,y) 並且格仔上的數字為 k ,則下一步到達的位置為 (x+k,y)或 (x,y+k)
輸入多組資料
第一行為乙個整數n,4<=n<=34.
接下來n行給出乙個數字矩陣,0<=矩陣中元素<=9.
輸出對於每組資料輸出乙個整數,表示從左上角到右下角的不同路徑數。
樣例輸入
42331
1213
1231
3110
43332
1213
1232
2120
511101
01111
11111
11101
11101
樣例輸出30
7
本題用bfs會超記憶體,用遞迴會超時。。
先貼上遞迴
#include
#include
#include
using namespace std;
int count=
0,n;
int map[35]
[35];
intdp
(int x,
int y)
if(map[x]
[y]==0)
return0;
if(x+map[x]
[y]if(y+map[x]
[y]}int
main()
return0;
}
然後是正確寫法:dp
動態規劃思想:每乙個點都由它上面點的和左邊的點到達。因此遍歷其上面的和左邊的點。用dp[i][j]記錄從起點到(i,j)有多少條路徑。
初始將起點的dp設定為1,其他點的dp都置0,這樣就可以確保只有來自起點的點才能被記錄。
#include
#include
#include
using namespace std;
intmain()
for(k=
0;k)//遍歷從上邊來的節點
} cout<[n-1
]<}return0;
}
演算法學習(六)
排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法 了解排序演算法原理 快速排序 歸併排序 插入排序 氣泡排序 選擇排序 及排序演算法的變種 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數...
演算法學習筆記 概率 期望 DP
概率 期望 dp,是一種 dp,用來計算概率或者是期望。其實我認為這種 dp 就是計算期望的,畢竟概率可以看成代價為 1 的期望。沒有學過期望的讀者可以看看這篇文章 演算法學習筆記 概率與期望 而概率 期望 dp,最關鍵的就是期望方程。下面看一道例題。cf1265e beautiful mirror...
演算法學習 數字DP
乙個極大的多位數字中,存在某種特殊情況出現多少次 通過記憶化和動態規劃的方法,將之前的情況數記錄下來,在計算其他情況的時候,通過狀態的轉移相互利用 模板 題意 求1 n之間有多少個數又含有13又能被13整除,1 n 1e9 include include define maxn 20 int dp ...