[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...