title: C++奧賽一本通刷題記錄(遞推)
date: 2017-11-08
tags:
一本通
openjudege
categories: OI
2017.11.8 By gwj1139177410

斐波那契數列 openjudge1760
#include using namespace std; const int maxn=1000010, mod=1000; int f[maxn]; int main(){ f[1] = f[2] = 1; for(int i = 3; i <= maxn; i++) f[i] = (f[i-1]+f[i-2])%mod;//bugs int t; cin>>t; while(t--){ int n; cin>>n; cout<1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pell數列 noioj1071&openjudge1788
#include using namespace std; const int maxn = 1000000+10,mod=32767; int f[maxn]; int main(){ f[1]=1; f[2]=2; int k = maxn; for(int i = 3; i <= k; i++)f[i]=(2*f[i-1]+f[i-2])%mod;//bugs int n; cin>>n; while(n--){ cin>>k; cout<1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上臺階 openjudge3525
//f[i]表示走i階臺階的走法數目 //因為每次只能走一階或者兩階,所以由f[i-1]和f[i-2]相加轉移而來 #include using namespace std; const int maxn = 110; int f[maxn], n; int main(){ f[1] = 1; f[2] = 2; f[3] = 4; for(int i = 4; i < maxn; i++)f[i] = f[i-1]+f[i-2]+f[i-3]; while(cin>>n && n)cout<1
2
3
4
5
6
7
8
9
10
11
12
流感傳染 openjudge6262
//BFS模板 #include #include using namespace std; const int maxn = 110; char a[maxn][maxn]; int n, m, cnt; int vis[maxn][maxn]; struct node{ int x, y, step; node(int x,int y, int step){ this->x = x; this->y = y; this->step = step; }; }; const int dx[] = {0,-1,0,1}; const int dy[] = {1,0,-1,0}; queueq; void bfs(){ while(q.size()) { node t = q.front(); q.pop(); for(int i = 0; i < 4; i++){ int nx = t.x+dx[i], ny = t.y+dy[i], st = t.step+1; if(st == m){ cout<=1&&nx<=n&&ny>=1&&ny<=n&&a[nx][ny]!='#'&&!vis[nx][ny]){ q.push(node(nx,ny,st)); vis[nx][ny] = 1; cnt++; } } } cout<>n; cin.get(); //datain bugs for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ a[i][j]=getchar(); if(a[i][j]=='@'){ q.push(node(i,j,0)); vis[i][j] = 1; cnt++; } } getchar(); } cin>>m; cin.get(); bfs(); return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
放蘋果 openjudge666&POJ1664&luogu2386
//f[i][j]表示i個蘋果j個盤子的放法數目 //j>i時,去掉空盤不影響結果; j<=i時,對盤子是否空著分類討論;* #include using namespace std; const int maxn = 11; int f[maxn][maxn]; int main(){ for(int i = 0; i < maxn; i++)f[0][i]=f[i][1]=1; for(int i = 1; i < maxn; i++)//pojbugs for(int j = 2; j < maxn; j++) f[i][j] = j>i?f[i][i]:f[i][j-1]+f[i-j][j];//所有盤子又有蘋果時每個盤子都去掉一個蘋果不影響結果 int t; cin>>t; while(t--){ int n, m; cin>>n>>m; cout<1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
吃糖果 openjudge1944
//f[i]表示名名吃i塊巧克力的方案數, f[0]=f[1]=1; #include using namespace std; int f[30]; int main(){ int n; cin>>n; f[0] = f[1] = 1; for(int i = 2; i <= n; i++) f[i%2]=f[(i-1)%2]+f[(i-2)%2]; cout<1
2
3
4
5
6
7
8
9
10
11
12
移動路線 openjudge2781
//f[i][j]表示從(m,1)到(i,j)的不同路線數目 #include using namespace std; const int maxn = 30; int f[maxn][maxn]; int main(){ int m, n; cin>>m>>n; f[m][0] = 1; for(int i = m; i >= 1; i--) for(int j = 1; j <= n; j++) f[i][j] = f[i+1][j]+f[i][j-1]; cout<1
2
3
4
5
6
7
8
9
10
11
12
13
14
判斷整除 openjudge3531
//f[i][j]表示用前i個數計算能得到余數j* #include using namespace std; const int maxn = 10010, maxk = 110; int a[maxn], f[maxn][maxk]; int main(){ int n, k; cin>>n>>k; for(int i = 1; i <= n; i++)cin>>a[i],a[i]%=k; f[1][a[1]] = 1; for(int i = 2; i <= n; i++) for(int j = 0; j < k; j++) if(f[i-1][j])f[i][(j+a[i])%k]=f[i][(j-a[i]+k)%k]=1; if(f[n][0])cout<<"YES\n";else cout<<"NO\n"; return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
踩方格 openjudge4982
//l[i],r[i],u[i]分別表示最后一步向左向右向上走到第i格* #include using namespace std; const int maxn = 30; int l[maxn], r[maxn], u[maxn]; int main(){ int n; cin>>n; l[1] = r[1] = u[1] = 1; for(int i = 2; i <= n; i++){ l[i] = l[i-1]+u[i-1]; r[i] = r[i-1]+u[i-1]; u[i] = l[i-1]+r[i-1]+u[i-1]; } cout<1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
山區建小學 openjudge7624
//f[i][j]表示1..i中建j個小學的最小距離和.(這里的j可以看成是最后一所學校管轄區的終點) //f[i][j]=min(f[i][j],f[k][j-1]+s[k+1][i]),j-1<=k #include #include using namespace std; const int maxn = 510; int a[maxn],dis[maxn][maxn],s[maxn][maxn],f[maxn][maxn]; //s[管轄區起點][管轄區終點]=這片轄區內建一個學校,區內村莊到學校的最小距離和 //一個結論:因為i..j中選一個點使所有點到這個點的總距離最小,這個點一定在中點位置(反證法,左移右移時) int dist(int l, int r){ int m = (l+r)/2, sum = 0; for(int i = l; i <= r; i++)sum += dis[i][m]; return sum; } int main(){ int m, n; cin>>m>>n; for(int i = 2; i <= m; i++)cin>>a[i],a[i]+=a[i-1]; //初始化兩兩距離 for(int i = 1; i <= m; i++) for(int j = 1; j <= m; j++) dis[i][j] = i==j?0:abs(a[j]-a[i]); //計算一個管轄從i到j村莊的學校到這些村莊的距離和 for(int i = 1; i <= m; i++) for(int j = 1; j <= m; j++) s[i][j] = dist(i,j); //初始化 for(int i = 1; i <= m; i++) for(int j = 1; j <= m; j++) f[i][j] = i==j?0:0xfffff; for(int i = 1; i <= m; i++)f[i][1] = s[1][i];//只建一所學校 //DP for(int i = 2; i <= m; i++)//村莊 for(int j = 2; j <= min(i,n); j++)//學校 for(int k = j-1; k < i; k++)//枚舉已有的(最后一所)學校管轄的范圍(終點) if(i!=j)f[i][j] = min(f[i][j],f[k][j-1]+s[k+1][i]); cout<1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
C++
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。