计算机算法设计与分析之不定期更新的日常+动态规划矩阵连乘+最长公共子序列
1.代码实现与分析如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=50;
int m[maxn][maxn];
int s[maxn][maxn];
void matrixChain(int *p,int n)///自底向上计算
{
for(int i=1; i<=n; i++) ///处理底部
{
m[i][i]=0;
}
for(int r=2; r<=n; r++)
{
for(int i=1; i<=n; i++)
{
int j=i+r-1;///i和j之间满足的关系
int k=i;///k表示括括号断开的位置
m[i][j]=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
s[i][j]=k;
for(k=i+1; k<j; k++)
{
int tmp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(tmp<m[i][j])///找最小值
{
m[i][j]=tmp;
s[i][j]=k;