ACM集訓第一天

2021-09-24 21:37:21 字數 1358 閱讀 7603

下午剛來集訓,在題庫裡刷了四道題,第一道題和第二道題都比較基礎,第三道題還挺有意思的,跟大家分享一下。

這是一道動態規劃題,可以根據樣例模擬一下 , 就可以求出狀態轉移方程了。

步驟大概是這樣的:a點 , b點,m是馬的位置,x是被馬攔著不能走的點(別告訴我你們連馬走"日"字都不知道)

其中每個點的值代表的是從a點走到這個位置需要用多少步

這樣很容易能看出來

關於 f[i][j] 這個點 , 從(0,0)位置到 b 點 , 會經過他這個點的路線有

f[1][1]=1

f[i][j] = f[i-1][j] + f[i][j-1]

但是這個方程是推不出結果的 , 因為這樣a點會在一開始的時候被覆蓋成0

所以修改以後的方程就是

f[1][1]=1

f[i][j] = max( f[i-1][j] + f[i][j-1] , f[i][j] )

當然還有不用max 的轉移方程

f[1][0] = 1

ff[i][j] = f[i-1][j] + f[i][j-1]

f[1][1] 這個點通過從 f[1][0]這個點直接轉移過來

因為轉移方程的時候需要 i-1和 j-1所以如果不從 1開始就會因陣列越界而 wa乙個點

從 1開始就是把每個點的座標都加了 1而已

另外這道題的標籤裡有高精

題目說明也寫著結果可能很大!但是 unsigned long 就可以過去

我的ac源**:

#include

#include

using namespace std;

int a[30]

[30];

unsigned

long

long f[30]

[30];

void

horse

(int x,

int y)

intmain

(int argc,

char

** ar**)

cout<

[y];

return0;

}

2013ACM集訓第一天!

列舉演算法應用一 用一分 二分 五分的硬幣組成一元錢,要求每種硬幣至少有乙個 分析 列舉物件的選取,用k,i分別表示五分硬幣和二分硬幣的個數,範圍分別是1到20和1到50,這相對一分硬幣個數範圍來比小很多,用這兩個迴圈時間複雜度較小 include using namespace std int m...

集訓第一天

1.兩個正整數,它們的乘積等於它們的最大公約數和最小公倍數的乘積。2.記憶法。用乙個陣列儲存計算的結果,而不是每次迴圈都計算一次。3.輸入多組資料 int n while n scanf 4.輸入 include using namespace std int x,y cin x y cout 5....

集訓第一天

熟悉系統程式設計,了解read open write fread fopen fwrite open開啟檔案o creat若欲開啟的檔案不存在則自動建立該檔案,o rdonly以唯讀方式開啟檔案 最後加入許可權 00700 等 定義函式 ssze t read int fd,void buf,siz...