C++奧賽一本通遞推題解

      網友投稿 823 2022-05-28

      title: C++奧賽一本通刷題記錄(遞推)

      date: 2017-11-08

      tags:

      一本通

      openjudege

      categories: OI

      2017.11.8 By gwj1139177410

      C++奧賽一本通遞推題解

      斐波那契數列 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小時內刪除侵權內容。

      上一篇:Android 通過廣播監聽USB連接狀態的改變
      下一篇:無人駕駛前沿~CCF-GAIR 2019--港科大自主駕駛中心主任劉明~《低速無人駕駛系統的應用關鍵要素》學習記錄
      相關文章
      亚洲另类少妇17p| 亚洲综合熟女久久久30p| 亚洲AV无码成人专区片在线观看| 337P日本欧洲亚洲大胆艺术图| 亚洲最大天堂无码精品区| 亚洲一区精品视频在线| 亚洲另类小说图片| 亚洲福利视频网站| 亚洲另类春色国产精品| 亚洲AV无码久久久久网站蜜桃 | 国产亚洲精品线观看动态图| 亚洲AV永久无码精品一区二区国产 | 久久久久亚洲精品影视| 亚洲av无码乱码国产精品fc2| 亚洲成av人片天堂网| 亚洲国产成人片在线观看无码| 亚洲国产精品无码久久一线 | 亚洲欧美成aⅴ人在线观看| 亚洲人av高清无码| AV激情亚洲男人的天堂国语| 国产亚洲精品美女| 亚洲精品无码你懂的网站| 在线观看亚洲精品国产| 亚洲精品成人网站在线观看| 亚洲AV无码专区亚洲AV伊甸园| 亚洲狠狠综合久久| 亚洲视频国产精品| 亚洲香蕉久久一区二区| 亚洲男人的天堂网站| 国产亚洲视频在线| 伊人久久大香线蕉亚洲| 亚洲av无码国产精品夜色午夜| 亚洲四虎永久在线播放| 亚洲国产成人无码av在线播放 | 亚洲熟妇av一区二区三区漫画| 久久精品7亚洲午夜a| 91午夜精品亚洲一区二区三区| 亚洲看片无码在线视频 | 久久精品亚洲一区二区三区浴池 | 国产亚洲精品成人a v小说| 国产亚洲av片在线观看16女人|