❶ 要比賽了,急求一道動態規劃題的矩陣乘法解法!
注意到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的第末列各個數對應相乘後加起來,就是乘法結果中第末行第末列的的數。
矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個矩陣的列數(column)和第二個矩陣的行數(row)相同時才有意義[1]。一般單指矩陣乘積時,指的便是一般矩陣乘積。一個m×n的矩陣就是m×n個數排成m行n列的一個數陣。由於它把許多數據緊湊的集中到了一起,所以有時候可以簡便地表示一些復雜的模型。