分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
給定乙個n*n的矩陣,計算最大子矩陣和。
思路:最大子段和問題可以用動態規劃在o(n)內解決,該題可以借助最大子段和的解法來做。我們考慮第i行到第j行的子矩陣,可以將i ~ j行的矩陣合併為乙個一維陣列,即把每列對應的數相加,那麼這個一維陣列的最大子段和就是原子矩陣的最大和。
我們用乙個二維陣列p來儲存矩陣的部分和,p[i][j]表示左上角是(1, 1),(下標從1開始), 右下角是(i, j)的矩陣中元素的和。如果我們要求i~j行、k~m列的矩陣中元素的和,我們可以通過以下式子計算得出:
sum = p[j][m] - p[j][k-1] - p[i-1][m] + p[i-1][k-1]
只需要o(1)的時間。
部分和p[i][j]要怎麼計算呢?我們可以通過更小的部分和來計算得到它:
p[i][j] = p[i-1][j] + p[i][j-1] - p[i-1][j-1] + a[i][j]
其中a[i][j]是矩陣中的整數。我們只需要o(n2 ) 的時間即可預處理得到所有的部分和。
所以總的時間為o(n3 )。
[cpp]view plain
copy
#include
#include
using
namespace std;
const
int n = 101;
int a[n][n], p[n][n];
int maxrecsum(int n)
for (int i = 1; i <= n; ++i)
int max = int_min;
for (int i = 1; i <= n; ++i)
} } return max;
} int main()
} cout <
return 0;
}
給我老師的人工智慧教程打call!
最大子矩陣求和問題
給定乙個n n的矩陣,計算最大子矩陣和。思路 最大子段和問題可以用動態規劃在o n 內解決,該題可以借助最大子段和的解法來做。我們考慮第i行到第j行的子矩陣,可以將i j行的矩陣合併為乙個一維陣列,即把每列對應的數相加,那麼這個一維陣列的最大子段和就是原子矩陣的最大和。我們用乙個二維陣列p來儲存矩陣...
最大子串行求和問題
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。輸入第1行給出正整數k 第2行給出k個整數,其間以空格分隔。在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。6 2 11 4 1...
最大子串行求和問題
給定整數a1 role presentation a1a 1,a2 role presentation a2a 2,an role presentation ana n 可能有負數 求 k ija k role presentation jk iak k i jak的最大值 為方便起見,如果所有整數...