1遞迴+記憶化 ->遞推
2狀態的定義 opt[n] dp[n] fib[n]
3狀態轉移方程 opt[n] = best_of(opt[n-1],opt[n-2],.....)
4最優子結構
比如斐波那契數列 n^2時間複雜度
int fib(int n)現在加入記憶化,增加快取
f[0]=0,f[1]=1;下面一道路徑判斷題for (int i=0;i<=n;++i)
最後起點到終點,遞推 10+17=27種
時間複雜度 o(m*n)
狀態方程
opt[i,j]=opt[i-1,j]+opt[i,j-1]dp 回溯 貪心的區別if a[i,j]= "空地":
opt[i,j]=opt[i-1,j]+opt[i,j-1]
else: //石頭
opt[i,j]=0
回溯(遞迴) 重複計算
貪心 永遠區域性最後
dp(動態規劃,遞推) 記錄區域性最優子結構/多種記錄值
習題:1爬樓梯,n層一共幾種辦法
public int climb(int n)2 三角型最小路徑和int mem=new int[n];
mem[0]=1;
mem[1]=2;
for(int i =2;ipython
def climb(self,n):
x,y=1,1
for _ in range(1,n):
x,y=y,x+y
return y
}零錢兌換
比如面值[1,2,5] 拼成11
貪心:每次選滿最大面值
dp:看成上台階,每次最少的步數
int coinchange(vector& coins, int amount)編輯距離return dp[amount]>amount ? -1:dp[amount];
}
兩個單詞,單詞1變為單詞2,最少需要多少操作
horse -> ros 只用插入刪除替換
1暴力法 bfs廣度優先
2dp 兩部曲
a 狀態 dp[i][j]
i表示單詞1 前i個字元,j表示單詞2前j個字元
單詞1 前i個字元 它匹配單詞2前j個字元
結果dp[m][n] 變動次數
bdp方程
dp[i][j]=
for i 0->m
for j 0->n
if w1[i]==w2[j]
dp[i][j]=dp[i-1][j-1]
else: // 插 刪 替
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
def mindistance(self,word1,word2):find 確定元素屬於哪乙個子集m,n=len(word1),len(word2)
dp=[[o for _ in range(n+1)] for _ in range(m+1)]
for i in range(m+1):dp[i][0]=i
for j in range(m+1):dp[0][j]=j
for i in range(1,m+1):
for j in range(1,n+1):
dp[i][j]=min(dp[i-1][j-1] + (0 if word1[i-1] == word2[j-1] else 1),
dp[i-1][j]+1,
dp[i][j-1]+1)
return dp[m][n]
union 將兩個子集合並成同乙個集合
經常解決的問題
1 小弟-》老大
2幫派識別
3兩種優化方法 合併&路徑壓縮
島嶼個數
朋友圈記憶
錢包-儲存櫃
**模組
class lru(object):def __init__(self,capacity):
self.dic=collections.ordereddict()
self.remain=capacity
def get(self,key):
if key not in self.dic:
return -1
v=self.dic.pop(key)
self.dic[key]=v
return v
def put(self,key,value):
if key in self.dic:
self.dic.pop(key)
else:
if self.remain >0:
self.remain -=1
else:
self.dic.popitem(last=false)
self.dic[key]=value
演算法題思路
鍊錶反轉 思路雙鏈表頭插法 利用棧查詢陣列不重複的值 思路利用異或運算 相同數值為0 任何職異或0為他本身的特性 計算質數 思路首先依次判斷2 n的各個數是否是質數 在暴力解法上優化,判斷乙個數是否是質數 只需要不能整除2到根號n之間的數就不是質數 2 n n大於1的數可以直接跳過肯定不是質數 使用...
FCC程式設計題筆記(2)
check for palindromes 檢查回文字串 如果給定的字串是回文,返回true,反之,返回false。如果乙個字串忽略標點符號 大小寫和空格,正著讀和反著讀一模一樣,那麼這個字串就是palindrome 回文 注意你需要去掉字串多餘的標點符號和空格,然後把字串轉化成小寫來驗證此字串是否...
javascript程式設計思路
程式是什麼?生活中的程式 宿舍保修 銀行開戶 解決生活中問題的步驟 流程 描述 自然語言 執行速度慢 計算機中的程式 解決問題的步驟描述,但是用的是計算機語言描述 計算機語言 執行速度快 什麼是程式設計 根據業務需要,制定或者編制解決問題的流程,編制程式的人應該是非常熟悉或者精通業務 編制電腦程式的...