導航:首頁 > 源碼編譯 > 動態規劃演算法矩陣乘法公式

動態規劃演算法矩陣乘法公式

發布時間:2022-03-08 18:58:05

❶ 要比賽了,急求一道動態規劃題的矩陣乘法解法!

注意到M<=5,狀態可以用0..31表示。計算每個狀態之間的 相容關系,構成一個有向圖。

這時轉化成一個圖論問題:求1111..111到111.11111的長為N的路徑總數。

可以用矩陣做。

矩陣有一個性質,自乘N次後,元素(i,j)表示由I到J的長度為N的路徑數。

program p1194;
type
matrix=array[0..31,0..31]of longint;
var
n,m,p:longint;
mm:array[0..70]of matrix;
ans:matrix;
pow:array[0..30]of longint;

function harmony(a,b:byte):boolean;
var
k,i:byte;
begin
for i:=1 to n do
if (a shr (i-1) and 1=0) then
begin
if (b shr (i-1) and 1=0) then exit(false);
b:=b xor (1 shl (i-1));
end;

i:=1;
while i<=n do
begin
if (b shr (i-1) and 1=1)then
begin
if (b shr (i-1)) and 3<>3 then exit(false);
i:=i+2;
end
else inc(i);
end;

exit(true);
end;

procere makematrix;
var
i,j:byte;
begin
for i:=0 to (1 shl n)-1 do
for j:=0 to (1 shl n)-1 do
if harmony(i,j) then mm[0][i,j]:=1;
end;

procere mul(var ma:matrix;t,u:matrix);
var
i,j,k:byte;
begin
fillchar(ma,sizeof(ma),0);
for i:=0 to 1 shl n-1 do
for j:=0 to 1 shl n-1 do
for k:=0 to 1 shl n-1 do
ma[i,j]:=(ma[i,j]+t[i,k]*u[k,j])mod p;
end;

procere main;
var
k,i,now:longint;
begin
pow[0]:=1;
for i:=1 to 30 do pow[i]:=pow[i-1]*2;
now:=1;k:=0;
while now<=m do
begin
now:=now*2;inc(k);
mul(mm[k],mm[k-1],mm[k-1]);
end;
now:=m-1;ans:=mm[0];

for i:=k downto 0 do
begin
if now>=pow[i] then
begin
mul(ans,ans,mm[i]);
now:=now-pow[i];
end;
if now=0 then break;
end;

writeln(ans[(1 shl n)-1,(1 shl n)-1]);
end;

begin
readln(m,n,p);
fillchar(mm,sizeof(mm),0);
makematrix;
main;
end.

❷ 矩陣間的乘法公式

如果C=AB的話,C中第a行b列的數為A的第a行乘上B的第b列
比如說A=|a1 a2| B=|b1 b2|
|a3 a4| B=|b3 b4|
那麼C=|a1*b1+a2*b3 a1*b2+a2*b4|
|a3*b1+a4*b3 a3*b2+a4*b4|
所以說如果是一個x1行x2列的矩陣乘上一個y1行y2列的矩陣,結果將是一個x1行y2列的矩陣

❸ 矩陣乘法演算法詳細過程

= 1*2 + (-1)*1 + 0*3 = 1

❹ 矩陣乘法演算法

int A[N][N];
int B[N][N];
int C[N][N];

for(int* pA = a, *pB = B, *pC = C; pA != B + N*N; ++pA, ++pB, ++pC)
{
*pC = *pA * *pB;
}

復雜度O(3N^2)

❺ 求大神用動態規劃演算法求解矩陣連續相乘下圖效果

#include<stdlib.h>
#include<stdio.h>

#define N 5
void Print_OPTIMAL_PARENS(int s[N+1][N+1],int i,int j) //定義函數列印最優全括弧的結果
{
if(i==j)
printf("A%d",i);
else
{
printf("(");
Print_OPTIMAL_PARENS(s,i,s[i][j]); //在分裂處進行遞歸調用
Print_OPTIMAL_PARENS(s,s[i][j]+1,j);
printf(")");
}
}
int main()
{
int matrix[N+1]; //matrix中記錄矩陣的維數
int i,j,k,q;
int m[N+1][N+1]; //m中記錄矩陣連乘的次數
int s[N+1][N+1]; //s[i][j]中記錄了對Ai...Aj進行分裂的最優的k值

for(i=0;i<=N;i++)
scanf("%d",&matrix[i]);

for(j=1;j<=N;j++)
for (i=j;i>=1;i--) //當i=j時,m[i][j]=0,
{ //當i<j時,m[i][j]=min{m[i][k]+m[k+1][j]+p(i-1)p(k)p(j)} i=<k<j
if (j==i)
m[i][j]=0;
else
{
m[i][j]=600000;
for (k=i;k<j;k++)
{
q=m[i][k]+m[k+1][j]+matrix[i-1]*matrix[k]*matrix[j];
if (q<m[i][j])
{
m[i][j]=q;
s[i][j]=k;
}
}
}
}
printf("計算得到的矩陣為: ");
for(i=1;i<=N;i++)
{
for (j=1;j<i;j++)
printf(" ");
for (j=i;j<=N;j++)
printf(" %d",m[i][j]);
printf(" ");
}
printf("矩陣連乘所需要的最少數量乘法次數為:%d ",m[1][N]);
//Print_OPTIMAL_PARENS(s,1,N);
return 0;
}

❻ 矩陣乘法公式

|a11 a12 …… a1n||b11 b12 …… b1k|

|a21 a22 …… a2n||b21 b22 …… b2k|=

| . . …… . || . . …… . |

|am1 am2 …… amn||bn1 bn2 …… bnk|

|a11*b11+a12*b21+……+a1n*bn1 a11*b12+a12*b22+……+a1n*bn2

若A、B和C表示三個矩陣並有C=AB,A為n行m列,B為m行q列,則C為n行q列

則對於C矩陣任版一元素Cij都有權

Cij=ai1*b1j+ai2*b2j+ai3*b3j+...+ain*bnj

i=1,2,3,...,n,j=1,2,3,...q

(6)動態規劃演算法矩陣乘法公式擴展閱讀:

1、當矩陣A的列數(column)等於矩陣B的行數(row)時,A與B可以相乘。

2、矩陣C的行數等於矩陣A的行數,C的列數等於B的列數。

3、乘積C的第m行第n列的元素等於矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。

❼ 動態規劃 矩陣連乘 c語言

#include <stdio.h>
#include <limits.h>
#include<stdlib.h>
#define LENGTH 6

void MatrixChainOrder(int p[],int m[][LENGTH],int s[][LENGTH])
{
int n=LENGTH;
int i,j,k,r,t;
for(i=0;i<n;i++)
m[i][i]=0;
for( r=1;r<n;r++)
{
for(i=0;i<n-r;i++)
{

j=i+r;
m[i][j]=m[i][i]+m[i+1][j]+p[i]*p[i+1]*p[j+1];
s[i][j]=i;
for(k=i+1;k<j;k++)
{
t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
printf("t=%d;,m[%d][%d]=%d\n",t,i,j,m[i][j]);
if(t<m[i][j])
{
m[i][j]=t;
s[i][j]=k;
}
}

}

}
}
int main()
{
int p[] = {30,35,15,5,10,20,25};
int m[LENGTH][LENGTH];
int s[LENGTH][LENGTH];
int i,j,k;
MatrixChainOrder(p,m,s);
printf("最少數乘次數:\n");
for(i = 0;i<LENGTH;i++)
{ for(j = 0 ;j<=i ;j++ )
printf(" ");
for(k = i; k<LENGTH;k++)
printf("%8d",m[i][k]);
printf("\n");
}
printf("斷開位置:\n");
for(i = 0;i<LENGTH;i++)
{ for(j = 0 ;j<=i ;j++ )
printf(" ");
for(k = i; k<LENGTH;k++)
printf("%4d",s[i][k]);
printf("\n");
}

system("Pause");
return 0;
}

❽ 矩陣乘法如何計算詳細步驟!

回答:

此題2行2列矩陣乘以2行3列矩陣。

所得的矩陣是:2行3列矩陣

最後結果為: |1 3 5|

|0 4 6|

拓展資料

1、確認矩陣是否可以相乘。只有第一個矩陣的列的個數等於第二個矩陣的行的個數,這樣的兩個矩陣才能相乘。

圖示的兩個矩陣可以相乘,因為第一個矩陣,矩陣A有3列,而第二個矩陣,矩陣B有3行。


6、檢查相應的數字是否出現在正確的位置。19在左下角,-34在右下角,-2在左上角,-12在右上角。

❾ 動態規劃一水題,矩陣乘法!

看看08年國家集訓隊俞華程大牛關於矩陣乘法的論文吧。

❿ 矩陣乘法怎麼算

比如乘法AB

一、

1、用A的第1行各個數與B的第1列各個數對應相乘後加起來,就是乘法結果中第1行第1列的數;

2、用A的第1行各個數與B的第2列各個數對應相乘後加起來,就是乘法結果中第1行第2列的數;

3、用A的第1行各個數與B的第3列各個數對應相乘後加起來,就是乘法結果中第1行第3列的數;

依次進行,(直到)用A的第1行各個數與B的第末列各個數對應相乘後加起來,就是乘法結果中第1行第末列的的數。

二、

1、用A的第2行各個數與B的第1列各個數對應相乘後加起來,就是乘法結果中第2行第1列的數;

2、用A的第2行各個數與B的第2列各個數對應相乘後加起來,就是乘法結果中第2行第2列的數;

3、用A的第2行各個數與B的第3列各個數對應相乘後加起來,就是乘法結果中第2行第3列的數;

依次進行,(直到)用A的第2行各個數與B的第末列各個數對應相乘後加起來,就是乘法結果中第2行第末列的的數。

依次進行,

(直到)用A的第末行各個數與B的第1列各個數對應相乘後加起來,就是乘法結果中第末行第1列的數;

用A的第末行各個數與B的第2列各個數對應相乘後加起來,就是乘法結果中第末行第2列的數;

用A的第末行各個數與B的第3列各個數對應相乘後加起來,就是乘法結果中第末行第3列的數;

依次進行,

(直到)用A的第末行各個數與B的第末列各個數對應相乘後加起來,就是乘法結果中第末行第末列的的數。

(10)動態規劃演算法矩陣乘法公式擴展閱讀:

矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個矩陣的列數(column)和第二個矩陣的行數(row)相同時才有意義[1]。一般單指矩陣乘積時,指的便是一般矩陣乘積。一個m×n的矩陣就是m×n個數排成m行n列的一個數陣。由於它把許多數據緊湊的集中到了一起,所以有時候可以簡便地表示一些復雜的模型。

參考資料:矩陣乘法_網路

閱讀全文

與動態規劃演算法矩陣乘法公式相關的資料

熱點內容
編譯原理好處 瀏覽:820
怎麼買伺服器主機 瀏覽:176
什麼app可以存檔游戲 瀏覽:430
那裡有螺桿壓縮機修理 瀏覽:31
什麼電腦軟體檢測安卓機 瀏覽:728
c語言編譯沒問題組件有錯誤 瀏覽:513
迅捷pdf編輯器破解版下載 瀏覽:14
電火花線切割怎麼編程 瀏覽:776
linux查看驅動命令 瀏覽:996
蘇州車輛解壓代辦大概多少錢 瀏覽:591
租房app什麼比較靠譜 瀏覽:676
運動app如何測量運動心率 瀏覽:782
蘋果手機文件夾圖標背景圖透明度 瀏覽:734
遼寧省解壓旅遊 瀏覽:271
pdf怎麼把部分圖紙拷到文件夾 瀏覽:697
讓程序員崩潰的40個瞬間 瀏覽:546
macbookair修改文件夾名稱 瀏覽:433
iphone如何快速刪除所有app 瀏覽:239
java高級編程pdf 瀏覽:886
編譯的時候報錯 瀏覽:389