sdnu 1038 收集寶藏(動態分析)

2021-08-10 21:20:26 字數 1350 閱讀 1874

time limit: 1500 ms    memory limit: 32768 kb

total submission(s): 247    accepted submission(s): 120

有乙個n*n的矩陣,矩陣每個格仔中都有一些寶藏,從左上角(1, 1)出發,每次只能向下或者向右移動一格,已知每個格仔中寶藏的價值,求走到右下角(n, n)時能收集到的寶藏的總最大價值。

第一行為乙個整數n(1 <= n <= 1000),表示矩陣的行、列數。

接下來n行,每行n個整數,每個整數表示當前格仔的寶藏價值(不超過10000)。

乙個整數,表示能收集到的寶藏的最大總價值。

4

1 2 3 10

3 4 1 1

5 2 1 1

1 3 1 1

19
看到這道題,首先想到的是列舉的方法,但是仔細一想,發現如果用列舉的話,結果太複雜,不好設立迴圈。於是考慮動態分析。
建立動態分析模型
假設最優答案:m【i】【j】
建立原問題與子問題之間的聯絡:
如果走到【i】【j】的位置,它上一步是【i - 1】【j】或者是【i】【j - 1】
取這兩步的最大值,就建立起來聯絡。
迭代公式建立
m[i][j] = max(m[i-1][j]+a[i][j],m[i][j-1]+a[i][j]);
**實現
#include #include using namespace std;

int main()

; for(int i = 1; i <= n; i ++)

for(int j = 1; j <= n; j ++)

scanf("%d", &a[i][j]);

static int m[1010][1010] = ;

m[1][1] = a[1][1];

for(int i = 2; i <= n; i ++)

m[i][1] = m[i - 1][1] + a[i][1];

for(int i = 2; i <= n; i ++)

m[1][i] = m[1][i - 1] + a[1][i];

for(int i = 2; i <= n; i ++)

for(int j = 2; j <= n; j ++)

m[i][j] = max(m[i-1][j]+a[i][j],m[i][j-1]+a[i][j]);

printf("%d\n", m[n][n]);

return 0;

}

sdnu 1206 螞蟻感冒

description 長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺 秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。請你計算,當所有螞蟻都爬離桿...

SDNU1332 矩陣交換

1 只交換行或列的標號。include include include include using namespace std int x 110 110 int y 110 110 int x bian 110 int y bian 110 int matrix 110 110 struct no...

sdnu1104資料排序

1104.資料排序 time limit 1000 ms memory limit 12288 kb total submission s 386 accepted submission s 145 description zzk和syc不知從哪個老師那裡拿到了一堆實驗資料,需要排序後再交回去。實驗...