首先是數字三角形問題,由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的時候還是都不太會,我主要認為我只知道了動態規劃的基本思想,就是將乙個大的問題,分成若干個小問題,但與貪心演算法不同的是,動態規劃中的每乙個小問題之間都相互影響,在每一步都取得最優解,且在不斷...