演算法學習筆記六 dp

2021-09-12 01:56:27 字數 1306 閱讀 6594

題目描述

在乙個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 ...