第二次上机
矩阵链乘
/* 1. Matrix-chain product. The following are some instances.
a) <3, 5, 2, 1,10>
b) <2, 7, 3, 6, 10>
c) <10, 3, 15, 12, 7, 2>
d) <7, 2, 4, 15, 20, 5>
*/
#include<iostream>
#include<algorithm>
#define INF1 0x3f3f3f3f //MAX
#define INF2 0xc0c0c0c0 //MIN
using namespace std;
#define size 7
//最小代价
int m[size][size];
//最优值对应的分割点k
int s[size-1][size];
//计算出各种长度区间的矩阵链乘的代价和最优分割点k
int Matrix_CHAIN_ORDER(int p[])
{
//n为矩阵的数目
const int n=size-1;
int q;
//初始化,长度为一的链的最小代价(只包含自身)
for(int i=1;i<=n;i++)
{
m[i][i]=0;
}
//区间长度l
for(int l=2;l<=n;l++)
{
int j;
//i为起始,j为结束,k为分割点
for(int i=1;i<=(n-l+1);i++)
{
j=i+l-1;
//无穷大
m[i][j]=INF1;
for(int k=i;k<=j-1;k++)
{
//计算m和s
q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(q<m[i][j])
{
m[i][j]=q;
s[i][j]=k;
}
}
}
}
return 0;
}
void PRINT_OPTIMAL_PARENS(int i,int j)
{
if(i==j) cout<<"A"<<i;
else{
cout<<"(";
PRINT_OPTIMAL_PARENS(i,s[i][j]);
PRINT_OPTIMAL_PARENS(s[i][j]+1,j);
cout<<")";
}
}
int main()
{
/* int p[size];
for(int i=0;i<size;i++)
{
cin>>p[i];
} */
int p[size]={
10, 3, 15, 12, 7, 2};
Matrix_CHAIN_ORDER(p);
PRINT_OPTIMAL_PARENS(1,size-1);
cout<<endl;
return 0;
}
最长公共子序列
/* 2. Longest Common Subsequence (LCS). The following are some instances.
a) X: xzyzzyx Y: zxyyzxz
b) X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD
Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG
*/
#include<iostream>
#include