最近演算法的practice

2022-05-07 20:18:09 字數 2418 閱讀 9725

2020/7/2

要點普通dp

兩個字串的匹配,乙個字串可以添刪改其中的字元,求變成另乙個字串的最少操作步數,dp[i][j]表示分別到i和j位置的最少步數,這樣狀態無後效性

模擬題字串模擬,用python方便很多,ord和chr兩個函式,利用 map(int,input().strip().split())輸入,

水題字串模擬,python:a[::-1]實現字串reverse

2020/7/3

要點水題

對於int,ceil(n/2.0)和(n+1)/2 不一樣?不一樣,前者輸出時doubel,後者時int,例如對於n=493796142,2.46898e+008和246898071

水題看清題意即為等差數列+特判水題無

時間好快呀,一晃過去六天沒寫題

2020/7/9

要點--

--模擬題

利用遞迴或者棧做字串解壓模擬,從外到裡,一層層去掉括號,可以保證順序不變

貪心開始以為是個dp,發現複雜度過不去。注意列舉順序,利用有限佇列維護。priority_queue,greater>是小頂堆

區間dp

1.區間dp的特點是,區間長度較小,而且一般狀態三四個維度,最外層列舉區間長度,第二層確定起點

區間dp

求最長回文子串行,\(dp[i][j]\) 為字串s 的第 i 個字元到第 j個字元的最長回文子串行長度。狀態轉移:\(if: s[i]==s[j],dp[i][j]=dp[i+1][j-1]+2. else:dp[i][j]=max(dp[i+1][j],max[i][j-1]\)

區間dp

求最長回文子串,我們可以強行規定\(dp[i][j]\) s中第 i 個字元和第 j 個字元都必須選,換句話說 \(dp[i][j]\) 其實是選完了整個 i 到 j 的區間的,也就是說,\(dp[i][j]==j-i+1\)時,這個區間是個回文串,否則就不是,\(dp[i][j]=0\) ,所以只需要用0,1表示是否是回文串。狀態轉移:\(if :dp[i+1][j-1]==1 ,and ,s[i]==s[j]時,dp[i][j]=1,else :dp[i][j]=0\)。

區間dp

利用兩個字串,組拼成為乙個字串,只需要保持原來每個字串的字元相對位置不變即可,與上乙個類似,\(dp[i][j][k][l]\)表示選擇第乙個字串i到j的位置,第二個字串k到l的位置,是否組成回文串,四個狀態注意。

題意:將n個石子分成k份,且每份不能為空,任意兩個方案不能相同(不考慮順序)。

把n劃分為k個,那麼先從n中拿乙個x,題目便變為將(n-x)分為k-1種,所以我們可以依次拿乙個1出來,遞推式為\(f[i−1][j−1]\),即有1的情況;

沒有1的情況,可以看成為j個元素預分配乙個1,剩下的便沒有1,即f[i-j][j]f[i−j][j]。故當i>ji>j時便有了遞推式\(f[i][j]=f[i-1][j-1]+f[i-j][j]\)

超時dfs,儲存每一種方案

void dfs(int num,int cur,int big)

for(int i=big;i<=num-cur+1;i++)

}

不超時dfs:

int dfs(int num,int cur)

}}int main()

cur=ind[cur][s[i]-'a'];

if(cur==-1)

cur++;

}if(f)puts("yes");

else puts("no");

}return 0;

}

題意:給你一棵 n 個節點的樹(保證 n 是偶數),你需要將 n 個節點分為 n/2 個點對,使得每個點對的兩個點的距離的和最小。

題解:

#include#define ll long long

using namespace std;

struct edge

};const int n=1e4+10;

vectorve;

vectorg[n];

int tot[n];//tot[i]表示包含i點的i的子樹大小

void add_edge(int u,int v,int cost)

ll ans=0;

void dfs(int u,int fa,int len)

if(tot[u]%2==1)ans+=len;

}int main()

dfs(1,0,0);

printf("%lld\n",ans);

for(int i=0;i<=n;i++)g[i].clear();

ve.clear();

}return 0;

}

Practice 氣泡排序的有趣實現

本文是對其理解 include using namespace std 常規,假定序列中不存在有序的 void bubble1 int arr,int n 優化 對有序的部分,不遍歷 只對無序的部分操作 若遍歷一趟,卻沒有元素的交換,則說明任意相鄰元素是滿足公升序關係的 即餘下部分是有序的 用fla...

最近看的演算法總結

ransac演算法 隨機取樣一致性 1.建立初始化模型。確定未知的引數。以單應矩陣為例。單應矩陣是乙個旋轉位移矩陣,二維上的某點到某點的矩陣。2.確定矩陣引數。要確定單應矩陣,要求解八個未知引數 因為歸一化後,必有乙個係數為1,所以又八個,而不是九個 共需要八個線性方程,對於影象而言,就是需要四個點...

K最近鄰演算法

參考 所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。cover和hart在1968年提出了最初的鄰近演算法。knn是一種分類 classification 演算法,它輸入基於例項的學習 instance based learning 屬於懶惰學習 lazy ...