藍橋杯之分治法與動態規劃

2022-07-29 18:24:10 字數 3237 閱讀 9719

[6.1 二分查詢]

已知有序的序列 int a,

整數 x

要求找到乙個剛好比x稍微大一點的元素位置

思路:磁體會進行遞迴,但是不是所有情況都遞迴,比如,我們只從每次結果中選出x所在範圍再進行遞迴,這樣會減少許多操作步驟,最後一步時,我們只有乙個數字,如果這個數字比x大,那麼這個數字的下標就是答案,否則,就是這個數字後面那個數字對應的下標。

**:

#includeint f(int a,int x,int begin,int end)

int k=(begin+end)/2;

if(x>=a[k])

return f(a,x,0,k);

}int g(int a,int x,int len)

int main()

--------------------------------------

[6.2 最大連續部分和]

陣列中整數有正有負

求連續一子段,使得和最大化

2,4,-7,5,2,-1,2,-4,3

最大連續段:5,2,-1,2

最大和為8

**:

#includeint g(int a,int begin,int end)

int k=(begin+end)/2;

int t1=g(a,begin,k);

int t2=g(a,k,end);

int t3a=0;

int sum=0;

for(int i=k-1;i>=begin;i--)

int t3b=0;

sum=0;

for(int i=k;it3b) t3b=sum; }

int t3=t3a+t3b;

int max=0;

if(t1>max) max=t1;

if(t2>max) max=t2;

if(t3>max) max=t3;

return max;

}int main()

--------------------------------------

[6.3 大數乘法]

multi("5935849584045839123456789","4595805849258430535")

略--------------------------------------

優化:博弈問題:

#include #includeusing namespace std;

mapm;

int fff(int n)

return 0;

}int main()

振興中華:

#includeint g(int m, int n)

int main();

for(int i=1;i<100;i++)

for(int i=2;i<100;i++) }

printf("%d\n",a[20][15]);

printf("%d\n",g(20,15));

}

[6.4 快取結果]

斐波那契 f(n) = f(n-1) + f(n-2)

解決方法:

1快取(按需存放)

2仔細設計計算次序,可以用陣列

思路:用陣列儲存結果

**:

#includeint main();

a[1]=1;

a[2]=1;

for(int i=3;i<10000;i++)

int n;

scanf("%d",&n);

printf("%d\n",a[n]);

}

--------------------------------------

[6.5 動態規劃]

城牆頂刷漆 

x國的一段古城牆的頂端可以看成 2*n個格仔組成的矩形(如圖所示)

現需要把這些格仔刷上保護漆。

你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔(對角相鄰也算數),但不能移動到較遠的格仔(因為油漆未乾不能踩!)

比如:a d b c e f 就是合格的刷漆順序。

c e f d a b 是另一種合適的方案。

當已知 n 時,求總的方案數。當n較大時,結果會迅速增大,請把結果對 1000000007 (十億零七) 取模。

輸入資料為乙個正整數(不大於1000)

輸出資料為乙個正整數。

例如:使用者輸入:

2程式應該輸出:

24再例如:

使用者輸入:

3程式應該輸出:

96再例如:

使用者輸入:

22程式應該輸出:

359635897

思路:錦囊:

fb(n)  從邊緣某格開始,到與它相鄰的另乙個邊緣格仔結束

fb(n) = fb(n-1) * 2

fa(n)  從某個邊緣格仔開始的所有情況 

fa(n) = fb(n)      最後走對面格 

+2*fa(n-1)     第1步走對面格  

+4*fa(n-2) 第2步走對面格

通過分析,我們發現,如果從中間的某個格仔開始,那麼它對面的格仔只能等到某一邊的格仔全部塗完後再塗,因為如果在先走那一邊還沒塗完的情況下塗了對面格仔,那麼那一邊沒有塗的格仔就沒有機會再塗了。我們先考慮從邊緣開始的情況。

情況1(從邊緣開始,到對面格仔結束):

fb(n)=fb(n-1)*2;

情況2(從邊緣開始,不是到對面格仔結束):

fa(n)=fb(i)*fa(n-i)*2+fb(n-i+1)*fa(i-1)*2

情況3(不從邊緣開始,從第i個開始):

fa(i,n)=fb(i)*fa(n-i)*2+fb(n-i+1)*fa(i-1)*2

**:

#include#define m 1000000007

long long fb(int n)

long long fa(int n)

long long fa(int i,int n)

long long g(int n);

long long fb[1000]=;

int f()

}long long g1(int n)

int main()

for(int i=1;i<130;i++)

}

藍橋杯考試 分治法

題目 找到乙個陣列中比給的數大一點的數 intarr 分析 運用分治法,從中間切一刀,看看再切的位置滿不滿足條件,不滿足再在左邊或者右邊搜尋 public class 6 分治 01二分查詢1 if arr k 1 n arr k n 如果剛好在二分的位置,返回 return arr k if ar...

演算法分析與設計 分治法 動態規劃

優化原則 最優子結構性質 問題的最優解中,每乙個子問題本身即是該子問題的最優解 即最優決策序列的任何子串行本身一定是相對於子串行的初始 結束狀態的最優決策序列 分解 盡量平衡 分解成規模盡量接近的子問題 解決 遞迴地解兩個規模為n 2的子問題 2.解決 遞迴地解兩個規模為n 2的子問題 合併描述最優...

藍橋杯 對局匹配 動態規劃

時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入格式 第一行包含兩個個整數n和k。第二行包含n個整數a1,a2,an。對於30 的資料,1 n 10 對於100 的資料,1 n 100000,0 ai 100000,0 k 100000 輸出格式 乙個整數,代表答案。樣例輸入 10 0...