No 3 DP動態規劃(一)

2021-08-21 16:14:25 字數 1493 閱讀 2738

首先是數字三角形問題,由n行數字,每行由與行數對應相等數量的數字組成,求三角形從頂點到底部的一條路徑使路徑上三角形的數字總和最大。行數在1<=n<=100之間。三角形中每個數字都在0--99之間。下面是筆者用c語言寫的**。

#include #include #include const int maxn=105;

int col[maxn][maxn];

int max(int a,int b)

int main()

} for(i=n;i>0;i--)

} printf("%d",col[1][1]);

}

(col  row)需要注意的是在定義陣列時,並沒有從0開始,而是從一開始。這個題是一道簡單的動態規劃題,在這裡,如果從頂點順序搜尋查詢,並不是一件容易的事,從底部則不同,從底部向上,可以排除掉較小的情況。資料如下:57

3 88 1 0

2 7 4 4

4 5 2 6 5

#include#include#define max 1000

using namespace std;

int data[max][max]; //儲存原始資料

int dp[max][max]; //儲存重新整理後的資料

int tower_walk(int n)

}//列印和最大路徑

int print(int n)

cout << endl;

}int main()

上式為網上c++演算法,筆者並沒有感覺特別好。

第二,最長上公升子串行(lis)的查詢,最長公共子串行(lcs)的查詢,最長公共上公升子串行的查詢。

關於最長公共上公升子區間的查詢,筆者有一種想法,但是被排除了:

分別求出各自的最長上公升子區間再求公共部分(貪心演算法)但是被排除了,例子如下:

11    12    13    4    5    6    7    8    9    10    14    15    16    17    18    19    

11    14    15    4    5    6    7    8    9    10    16    17     18    19    20    21

在這種情況下不成立。

要求最長上公升子串行利用dp方程,f[i] 表示為序列a[1..i]中的乙個最長遞增子串行中的長度(以a[i]結尾)狀態轉移方程為:f[i]=max

j < i 

a[j]#include #include #include using namespace std;

const int maxn=300;

char a[maxn],b[maxn];

int lena,lenb;

int lcs(int i,int j)

int main()

return 0;

}但是oj顯示tl,筆者將陣列壓到200依然無法通過。

動態規劃 一

在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...

動態規劃(一)

動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...

動態規劃 (一)

對於動態規劃的學習總共進行了兩節課,到現在為止還是一頭霧水,雖然看懂了老師上課講的例題,但是做v judge的時候還是都不太會,我主要認為我只知道了動態規劃的基本思想,就是將乙個大的問題,分成若干個小問題,但與貪心演算法不同的是,動態規劃中的每乙個小問題之間都相互影響,在每一步都取得最優解,且在不斷...