演算法一(前言 動態規劃)

2021-07-15 10:17:25 字數 1628 閱讀 8800

演算法有什麼作用呢,在我的理解來看:演算法可以鍛鍊自己的邏輯思維能力,問題解決能力,在特定的應用場合能夠更快更好的確定計算方法,當然,在程式設計中,有各種各樣需要解決的問題,演算法是定的,人是活的,精通演算法更多的是在思維上對人的幫助。

最後:不懂演算法的程式設計師不是合格的程式設計師

今天去面試,出了個演算法題,題目如下:

在如下8*6的矩陣中,請計算從a移動到b一共有多少種走法。要求每次只能向上或向右移動一格,並且不能經過p

如果你對各種演算法不熟悉 或者沒有對類似問題做過思考與歸納總結,又或者你沒有看過這方面的資料文獻,那麼如果你的思維能力不是很強,可能搞個半天不一定能夠得出正確的答案 。

這個問題是屬於典型的動態規劃類的演算法

假如a到b的總的走法為記為ab,

a到p記為ap,

p到b記為pb,

那麼符合規則的走法re = ab - (ap * pb);

橫向假如設為x軸,縱向設為y,

用(x,y)表示各點的座標

那麼除a(1,1)點外y座標為1的點的值(到此點的走法)都為1,除a(1,1)點外x座標為1的點的值(到此點的走法)也都為1;除去以上點,那麼各個點的走法為到他左邊點的走法加上到它下面點的走法,用二維陣列表示即為:arr[x][y]=arr[x-1][y]+[x][y-1];

c語言實現如下

int count(int x,int y);

for(int i=1;i<=x;i++)else}}

return dp[x][y];

}

php實現如下

function

roadcount

($x,$y)else

if(($i==1 || $j==1) && ($i != $j))else}}

return

$arr[$x][$y];

}

python實現

def

roadcount

(x,y):

x = x+1;

y = y+1;

list = [([0]*(y)) for i in range((x))];

for i in range(1,x):

for j in range(1,y):

if (i == 1

or j==1) and (i !=j):

list[i][j] = 1;

else:

list[i][j] = list[i-1][j] + list[i][j-1];

return list[x-1][y-1];

如果你沒得卵事,可以用ruby、js、perl等語言實現它 但是最核心是:

dp[i][j] = dp[i][j-1]+dp[i-1][j];

即後面的資料與前面的資料有某種因果關係。所有這種類似的問題都可以用這種模型去解決。這就體現了學習演算法的最主要作用:思維+模式;

活學活用,不要死記!!!

從下一節起,將會研究各種演算法

MySQL系列一 前言

mysql大體來講分為兩部分 service層,儲存引擎層 1 service層 查詢快取 命中則直接返回結果,以key value形式存放在記憶體中,如果表 現更新操作,則快取全部失效,在mysql8.0版本之後已經去掉這個模組 分析器 詞法,語法分析,檢查你的sql是否有一場 優化器 執行計畫生...

軟體工程(一) 前言

筆者正在學習 軟體工程 實踐者的研究方法 這本書,記錄下一些讀書筆記,共勉!軟體開發時間長 開發成本高 軟體交付客戶前,無法找到所有錯誤 維護已有程式花費較高的時間和人力代價 軟體開發和維護過程難以度量。1 指令的集合,通過執行這些指令可以滿足預期的特徵 功能和效能需求 2 資料結構,使得程式可以合...

效能優化總結(一) 前言

最近一直忙著學2010 wpf 看架構師教程 學英語,搞得都沒時間寫部落格了。最近在gix4專案上做了一些效能方面的優化,為了方便和同事們分享經驗,今天準備把一些相關的小技巧都寫一下。這幾個技巧並不難,也不是說設計得多好,而是我覺得它們很重要。記得我在做上乙個web系統時,也支援oo的業務富模型,其...