題目:
乙個 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最高次方數 取商是常數 那麼同數量級就是這個演算法的時間複雜度 ...
計算時間複雜度與空間複雜度
如何衡量乙個演算法的好壞?複雜度 空間複雜度 時間複雜度 事後統計法 就是在演算法的程式執行結束後,根據實際執行結果衡量演算法好壞 事前估計法 就是在程式執行之前,先按照程式 來預估演算法的好壞 時間複雜度 用基本指令的執行次數而不是執行時間代表時間複雜度,同乙個程式在不同配置的機器下的執行時間不一...