區間DP 矩陣相乘複雜度計算

2021-07-10 21:49:48 字數 1332 閱讀 5080

題目:

乙個 a*b的矩陣與乙個b*c的矩陣相乘,複雜度是 a*b*c,會得到乙個a*c的矩陣。但是!!!我出題目的時候懵逼了!!!!!,複雜度弄成a*b*b*c了,所以你們就按我的來。

現在有n個矩陣連乘,不同的計算順序複雜度是不一樣的,求最小複雜度。

a*b的矩陣與乙個b*c的矩陣相乘,複雜度是a*b*b*c!!!!

首先是乙個n(n在100到200之間),表示有n個矩陣

然後一行,有2*n 個數,每兩個數表示乙個矩陣的維數。所有的 數小於或等於1000

思路:區間dp入門。dp[i][j]表示從第i個矩陣到第j個矩陣相乘的最小複雜度,初始化為正無窮,這個無窮一定要比最大的答案大,1e16(實際比他小)就可以了。因為矩陣相乘是只能相鄰兩個,所以只用儲存資料的行,以及最後乙個矩陣的列。dp[i][i+1] = a[i]*a[i+1]*a[i+1]*a[i+2];列舉起點i和終點j,列舉i到j的最後乙個乘法k,有dp[i][j] = min(dp[i][j] , a[i]*a[k+1]*a[k+1]*a[j+1] + dp[i][k] + dp[k+1][j]);

最後答案就是dp[0][n-1]

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#pragma comment(linker, "/stack:102400000,102400000")

#define maxn 205

#define mod 1000000007

#define mem(a , b) memset(a , b , sizeof(a))

#define ll long long

#define inf 100000000

int n;

ll a[maxn*2];

ll dp[maxn][maxn];

int main()

// for(int i = 0 ; i <= n ; i ++) cout << a[i] << endl;

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

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

//solve(0 , n-1);

for(int i = n-1 ; i >= 0 ; i --) //起點}}

printf("%lld\n" , dp[0][n-1]);

}return 0;

}

複雜度計算

在1 n 中,能被 2整除的有 n 2個,能被 3整除的有 n 3個,則該演算法的複雜度可這樣計算 o n n 2 1 n 3 2 n 5 3 n 7 4 即o n n n 考慮到6這個數,它既是2的倍數,也是3倍數,因此還要用到容斥原理。設能被第 i個素數整除的正整數的集合為ai。對於特定的乙個整...

計算複雜度

求極限 n 無窮大 表示式n 無窮大 表示式1 n 0 2n2 2n3 n n 3 2 n 2 1 n 2 n 無窮大的時候 2 n 0 1 n 2 0 2 常數 此演算法的時間複雜度是n 3 時間複雜度的概念 執行的次數和同數量級 n最高次方數 取商是常數 那麼同數量級就是這個演算法的時間複雜度 ...

計算時間複雜度與空間複雜度

如何衡量乙個演算法的好壞?複雜度 空間複雜度 時間複雜度 事後統計法 就是在演算法的程式執行結束後,根據實際執行結果衡量演算法好壞 事前估計法 就是在程式執行之前,先按照程式 來預估演算法的好壞 時間複雜度 用基本指令的執行次數而不是執行時間代表時間複雜度,同乙個程式在不同配置的機器下的執行時間不一...