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)。
乙個整數,表示能收集到的寶藏的最大總價值。
41 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不知從哪個老師那裡拿到了一堆實驗資料,需要排序後再交回去。實驗...