matrixchain區塊鏈
1. 矩陣連乘問題,為什麼運行不了
不是所有矩陣都可以互相相乘
!大多數矩陣
不可以
相乘。
A
矩陣
X
B
矩陣,
只有
當
A
的列數
等於
B的
行數
才可以
乘,
得出的
C
矩陣
行數
同
A
的行數,
列數
同
B的列數。
A
X
B
可以時,B
X
A
往往不可以,除非是方陣。
你要
矩陣連乘,有一個依次乘的順序,必需保證
每次乘時
新的前矩陣列數
等於
新的
後矩陣
行數。否則
乘法
不成立。
2. 動態規劃矩陣連乘問題
可憐,100分還沒人理你,給我吧。
動態規劃問題可以有tD/eD的形式,n^t為問題的大小,n^e為問題所依賴的子問題的大小
1D/1D型,最長上升子序列
2D/0D型,最長公共子序列
2D/1D型,多源最短路徑
2D/2D型,雙背包問題
當然可以有3D/1D或者更高的。
動態規劃題目千變萬化,主要是要學會思考方法,要能看到題目很快找出題目中的狀態,找准狀態後就基本沒有難度了
3. 指向指針的指針做函數參數
這說明你對指針理解還不夠透徹。
int **t;
還沒有分配內存能拿來t = b么?
這個先不說,
b[3][2]是2維的數組,所以
int b[3][2]={{1,2},{1,2},{1,3}};
不僅自己方便辨認也對你的代碼清晰有好處
至於你函數的傳值,我不需要看你的函數就知道不行
因為b[3][2]這樣的數組,可以看成3行和2列,也可以看成
3個指向2維數組的指針
但是函數傳值的時候編譯器可以figure out數組前面的那一維,但是不能知道後面那一組的大小,所以你要明確指明後面的大小,所以prototype里要寫
int m[][a],a是一個值
至於內存分配,比如
我寫個
int *i, a;
a = 10;
*i = a;
這個對么?明顯不對,因為i是指針,沒有分配過內存
我不是中文學的,所以表述有點不清,但是malloc和指針是比較有難度的,慢慢來
還有樓上那位兄弟寫的挺好,這里提醒一下需要注意int *t[n]和int (*t)[n]相差甚遠,所以留心。
今天看了一下發現俺對你的意思理解有點偏差,不好意思,
「指向指針的指針不是可以表示二維數組么?為什麼傳二維數組給**m 報錯?」
指向指針的指針可以表示二維數組,前提是你要先分配內存.
比如
int **t;
t = (int **)malloc(3*sizeof(int *));
這樣t就是一個含有3個指針的數組,
然後你再單獨對每一個指針分配內存:
int i;
for(i = 0; i < 3; i++){
t[i] = (int *)malloc(2*sizeof(int));
}
這樣t才可以看做二維數組,
而單單的int **t僅僅是指向一個指向整數的指針。
所以你可以寫
int **t, *ptr, a;
a = 10;
ptr = &a;
t = &ptr;
但是不能直接用作函數原型里作為2維數組傳值的形參。
函數原型里要寫作
void MatrixChain(int *p,int n,int m[][6],int s[][6]);
這樣傳值才是對的,原因參見我前面講的
這個就是解決方法
4. 動態規劃演算法matrixchain怎麼計算
備忘錄方法是動態規劃方法的變形。與動態規劃演算法不同的是,備忘錄方法的遞歸方式是自頂向下的,而動態規劃演算法則是自底向上的。 如: 求LCS的問題: 當xi=yj時,求C[i,j]只需知道C[i-1,j-1],而無需用到C[i,0]~C[i,j-1]及C[i-1,j]
5. 用動態規劃方法求【矩陣連乘】最小次序的程序
您好嗎,這樣的:
#include<iostream> using namespace std;
const int MAX = 100;
//p用來記錄矩陣的行列,main函數中有說明
//m[i][j]用來記錄第i個矩陣至第j個矩陣的最優解 //s[][]用來記錄從哪裡斷開的才可得到該最優解 int p[MAX+1],m[MAX][MAX],s[MAX][MAX];
int n;//矩陣個數
int matrixChain() {
for(int i=0;i<=n;i++) m[i][i]=0;
for(int r=2;r<=n;r++)//對角線循環 for(int i=0;i<=n-r;i++)//行循環 {
int j = r+i-1;//列的控制
//找m[i][j]的最小值,先初始化一下,令k=i m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j +1]; s[i][j]=i;
//k從i+1到j-1循環找m[i][j]的最小值 for(int k = i+1;k<j;k++) {
int temp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
if(temp<m[i][j]) {
m[i][j]=temp;
//s[][]用來記錄在子序列i-j段中,在k位置處 //斷開能得到最優解 s[i][j]=k; } } }
return m[0][n-1]; }
//根據s[][]記錄的各個子段的最優解,將其輸出 void traceback(int i,int j) {
if(i==j) {
cout<<'A'<<i; return
}
if(i<s[i][j]) cout<<'(';
traceback(i,s[i][j]); if(i<s[i][j]) cout<<')'; if(s[i][j]+1<j) cout<<'(';
traceback(s[i][j]+1,j); if(s[i][j]+1<j) cout<<')'; }
void traceback(){ cout<<'(';
traceback(0,n-1); cout<<')'; cout<<endl; }
int main() {
cout<<"請輸入矩陣的個數:"<<endl; cin>>n;
cout<<"輸入矩陣(形如a*b,中間用空格隔開):"<<endl; for(int i=0;i<=n;i++) cin>>p[i];
//測試數據可以設為六個矩陣分別為
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25] //則p[0-6]={30,35,15,5,10,20,25} cout<<"輸出結果如下:"<<endl; matrixChain();
traceback(0,n-1);
//最終解值為m[0][n-1]; cout<<endl; return 0;
}
6. c++的動態規劃 關於二維數組的問題
#include "stdafx.h"
#include "conio.h"
#include <iostream>
using namespace std;
void MatrixChain(int* p, int n, int m[7][7],int s[7][7])
{
for(int i=1;i<=n;i++)m[i][i]=0;
for(int r=2;r<=n;r++)
for(int i=1;i<=n-r+1;i++)
{
int j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1;k<j;k++)
{
int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j]){m[i][j]=t;s[i][j]=k;}
}
}
}
void Traceback(int i,int j,int s[7][7])
{
if(i==j)return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
cout<<"Multiply A"<<i<<","<<s[i][j];
cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;
}
int main()
{
int p[7]={5,4,7,8,3,6,9};
int n=6;
int m[7][7];
int s[7][7];
MatrixChain(p,n,m,s);
Traceback(1,6,s);
getchar();
return 0;
}
你的**c指針不能用 new *c 指針可以new 所以出錯 直接用數組就可以了
上面代碼我編譯過了 絕對可以通過啊。
7. Matrix交易所是DFG孵化區塊鏈企業嗎
是的,將在一個真正的全球化平台上為用戶提供數字資產的交易和託管服務
8. Matrix交易所是DFG孵化的區塊鏈企業嗎
是的,這是受阿布扎比全球市場(ADGM)金融服務監管局(FSRA)許可的
9. 二維數組指針
int **m;可以分步驟來理解
**m意思是引用這個整型數,*m代表指向這個整型數的指針,m代表指向*m的指針,也就是傳說中指向指針的指針
一般情況下形參為指針類型時,可以傳送數組名作為實參,也即數組的起始地址,二維數組的可以看成是多個一維數組組成的
10. c++ 矩陣連乘演算法返回值問題
#include<stdio.h>
#include<stdafx.h>
voidMatrix_ABC(double*a,double*b,double*c,double*result,intm,intn,intp,intq);
voidmain()
{
intm=3,n=2,p=2,q=4;
doublea[]={1,0,1,0,1,0};
doubleb[]={2,3,2,3};
doublec[]={3,1,3,1,0,0,0,0};
double*result;
result=newdouble[m*q];
inti,j;
printf("A ");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%f ",a[i*n+j]);
printf(" ");
}
printf("B ");
for(i=0;i<n;i++)
{
for(j=0;j<p;j++)
printf("%f ",b[i*p+j]);
printf(" ");
}
printf("C ");
for(i=0;i<p;i++)
{
for(j=0;j<q;j++)
printf("%f ",c[i*q+j]);
printf(" ");
}
printf(" ");
Matrix_ABC(a,b,c,result,m,n,p,q);
printf("A*B*C ");
for(i=0;i<m;i++)
{
for(j=0;j<q;j++)
printf("%f ",result[i*q+j]);
printf(" ");
}
delete[]result;
}
voidMatrix_ABC(double*a,double*b,double*c,double*result,intm,intn,intp,intq)
{
inti,j,k;
double*temp;
temp=newdouble[m*p];
for(i=0;i<m;i++)
for(j=0;j<p;j++)
{
temp[i*p+j]=0;
for(k=0;k<n;k++)
temp[i*p+j]+=a[i*n+k]*b[n*k+j];
}
for(i=0;i<m;i++)
for(j=0;j<q;j++)
{
result[i*q+j]=0;
for(k=0;k<p;k++)
result[i*q+j]+=temp[i*p+k]*c[q*k+j];
}
delete[]temp;
}