2014百度之星資格賽解題報告 Labyrinth

2022-08-10 20:06:18 字數 1352 閱讀 9194

labyrinth

時間限制: 1s  記憶體限制: 65536k

問題描述

輸入輸入的第一行是乙個整數t(t < 200),表示共有t組資料。

每組資料的第一行輸入兩個正整數m,n(m<=100,n<=100)。接下來的m行,每行n個整數,分別代表相應格仔中能得到金幣的數量,每個整數都大於等於-100且小於等於100。

輸出對於每組資料,首先需要輸出單獨一行」case #?:」,其中問號處應填入當前的資料組數,組數從1開始計算。

每組測試資料輸出一行,輸出乙個整數,代表根據最優的打法,你走到右上角時可以獲得的最大金幣數目。

樣例輸入

23 4

1 -1 1 0

2 -2 4 2

3 5 1 -90

2 21 1

1 1樣例輸出

case #1:

18case #2:

4解題報告

考慮每一列可以向上向下走,但必須走走以前沒有走過的格仔,所以度度熊在每一列上都只能選乙個方向走,加上可以往右走,這樣在每個格仔上的狀態就只要2種:

1.      state[x][y][0]表示之後只能向下或向右走;

2.      state[x][y][1]表示之後只能向上或向右走;

動態規劃的遞推公式為:

1.      state[x][y][0] = max + value[x][y];

2.      state[x][y][1] = max + value[x][y];

最後只要看取右上角的兩個狀態的最大值即可,即max 。

動態規劃的時間複雜度是o(n*n)。

解題**:

#include #include #include using namespace std;

int a[128][128];

int dp[128][128][2];

bool f[128][128][2];

int n = 0, m = 0;

int calc(int i, int j, int d)

if (f[j][d])

f[j][d] = true;

if (d == 0)

else if (d == 1)

return dp[j][d];

}int main()

}memset(f, 0, sizeof(f));

dp[1][1][0] = dp[1][1][1] = a[1][1];

f[1][1][0] = f[1][1][1] = true;

printf("%d\n", max(calc(1, m, 0), calc(1, m, 1)));

}}

2014百度之星資格賽解題報告 能量變換

qaz的能量變換 題目描述 魔法師百小度也有遇到難題的時候 現在,百小度正在乙個古老的石門面前,石門上有一段古老的魔法文字,讀懂這種魔法文字需要耗費大量的能量和大量的腦力。過了許久,百小度終於讀懂魔法文字的含義 石門裡面有乙個石盤,魔法師需要通過魔法將這個石盤旋轉x度,以使上面的刻紋與天相對應,才能...

百度之星資格賽

1001 給你1 n這n個數字,公升序排列,接下來按照陣列a進行位置變換,a i 代表第i個數字會變到a i 位置上,a中的數字也是從1 n。現在問有多少個不同的陣列能滿足做一次變換和做三次變換結果相同。我們可以這樣分析,x y是唯一的到y的途徑,假設x y為第一次變換,因此在第三次變換的時候任然為...

2016 百度之星 資格賽

變懶了,最近做的很多題目都不想貼了。本來就sb,還那麼懶,沒救了。a沒想太多,設個逆元就過了。b斐波那契數列高精度。n 0時輸出換行。c字典樹,記錄結點的單詞數 以及 當前結點是否是單詞的末尾,delete時需要先找出字首對應的串數,那麼就dfs統計末尾結點總數,然後用字首減掉就好了。一開始dfs跑...