下午剛來集訓,在題庫裡刷了四道題,第一道題和第二道題都比較基礎,第三道題還挺有意思的,跟大家分享一下。
這是一道動態規劃題,可以根據樣例模擬一下 , 就可以求出狀態轉移方程了。
步驟大概是這樣的: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...