动态规划相关问题源码(包括矩阵链乘、LCS、和max sum)
2010-10-16 11:45
477 查看
functions.h
#include <iostream>
using namespace std;
#define SIZE 100 //数组大小
//****重载的计算数组长度函数****
int length(int a[]);
int length(char a[]);
//-----------------------------------
//****初始化数组函数******
void InitArray(int a[SIZE][SIZE]);
void InitArray(double a[SIZE][SIZE]);
//-----------------------------------
//****输入数组中数据*****
void Input(char p[]);
void Input(int p[]);
//-----------------------------------
//****打印数组中数据*****
void PrintArray(int a[SIZE][SIZE],int lr,int lc);
//-----------------------------------
//*****矩阵链乘*****
void Matrix_chain_order(double m[20][20],double s[20][20],int p[20]);
void Print_optimal_parens(double s[20][20],int i,int j);
//-----------------------------------
//********LCS********
void LCS_Length(char x[],char y[],int b[SIZE][SIZE],int c[SIZE][SIZE]);
void Print_LCS(int b[SIZE][SIZE],char x[],int i,int j);
//-----------------------------------
//*******Max_Sum******
int BetterMaxSum(int n, int a[], int &besti, int &bestj);
//-----------------------------------
functions.cpp
#include "Functions.h"
//**************************************************************
//----------计算数组a中元素个数,返回元素个数值------------------
int length(int a[])
{
int count=0;
while(a[count]!=0)
count++;
return count;
}
int length(char a[])
{
int count=0;
while(a[count]!='/0')
count++;
return count-1;
}
//--------------------------------------------------------------
//**************************************************************
//--------初始化二维数组a,将其中所有元素值均赋为0--------------
void InitArray(int a[SIZE][SIZE])
{
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
a[i][j]=0;
}
}
}
void InitArray(double a[SIZE][SIZE])
{
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
a[i][j]=0;
}
}
}
//--------------------------------------------------------------
//**************************************************************
//------------------输入数组p中元素-----------------------------
void Input(char p[])
{
cout<<"输入序列:";
gets(p);
//_____________________________
// 将字符数组中所有元素后移一位
//-----------------------------
int pos=0;
while(p[pos]!='/0')
pos++;
p[pos+2]='/0';
while(pos>=0)
{
p[pos+1]=p[pos];
pos--;
}
//------------------------------
}
void Input(int p[])
{
int len;
cout<<"输入序列长度:";
cin>>len;
for(int i=0;i<len;i++)
{
cout<<"输入数据p"<<i<<":";
cin>>p[i];
}
p[len]=0;
}
//--------------------------------------------------------------
//**************************************************************
//--------------------输出数组中元素----------------------------
void PrintArray(int a[SIZE][SIZE],int lr,int lc)
{
for(int i=0;i<lr;i++)
{
for(int j=0;j<lc;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
//--------------------------------------------------------------
//**************************************************************
//-----------------矩阵链乘相关函数实现-------------------------
void Matrix_chain_order(double m[20][20],double s[20][20],int p[20])
{
int n=length(p)-1;
for(int i=1;i<=n;i++)
m[i][i]=0;
for(int l=2;l<=n;l++)
{
for(int i=1;i<=(n-l+1);i++)
{
int j=i+l-1;
m[i][j]=10000000;
for(int k=i;k<=(j-1);k++)
{
int 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;
}
}
}
}
}
void Print_optimal_parens(double s[20][20],int i,int j)
{
if(i==j)
cout<<"A"<<i;
else
{
cout<<"(";
Print_optimal_parens(s,i,s[i][j]);
Print_optimal_parens(s,s[i][j]+1,j);
cout<<")";
}
}
//--------------------------------------------------------------
//**************************************************************
//-------------------LCS相关函数实现----------------------------
void LCS_Length(char x[],char y[],int b[SIZE][SIZE],int c[SIZE][SIZE])
{
int m=length(x);
int n=length(y);
for(int i=1;i<=m;i++)
c[i][0]=0;
for(int j=0;j<=n;j++)
c[0][j]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=2;
}
else
{
if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=3;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=4;
}
}
}
}
}
void Print_LCS(int b[SIZE][SIZE],char x[],int i,int j)
{
if(i==0||j==0)
return;
if(b[i][j]==2)
{
Print_LCS(b,x,i-1,j-1);
cout<<x[i];
}
else
{
if(b[i][j]==3)
Print_LCS(b,x,i-1,j);
else
Print_LCS(b,x,i,j-1);
}
}
//--------------------------------------------------------------
//**************************************************************
//---------------Max-Sum相关函数实现----------------------------
int BetterMaxSum(int n, int a[], int &besti, int &bestj)
{
int sum = 0;
for(int i=1; i <= n; ++i)
{
int thissum = 0;
for(int j=i; j <= n; ++j)
{
thissum += a[j];
if(thissum > sum)
{
sum = thissum;
besti = i, bestj = j;
}
}
}
return sum;
}
//--------------------------------------------------------------
main.cpp
#include "Functions.h"
int main()
{
//######################################
//===========矩阵链乘测试代码=========
/*int p[20];
Input(p);
double m[20][20],s[20][20];
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
m[i][j]=0;
s[i][j]=0;
}
}
Matrix_chain_order(m,s,p);
Print_optimal_parens(s,1,length(p)-1);
*/
//########################################
//#######################################
//=========== LCS测试代码 ============
/*char x[SIZE],y[SIZE];
cout<<"请输入序列1:"<<endl;
Input(x);
cout<<"请输入序列2:"<<endl;
Input(y);
int b[SIZE][SIZE],c[SIZE][SIZE];
InitArray(b);
InitArray(c);
LCS_Length(x,y,b,c);
PrintArray(c,length(x)+1,length(y)+1);
PrintArray(b,length(x)+1,length(y)+1);
Print_LCS(b,x,length(x),length(y));*/
//#######################################
//#######################################
//==========Max-Sum测试代码==========
int a[20];
Input(a);
int besti,bestj;
int sum=BetterMaxSum(length(a),a,besti,bestj);
cout<<"Ans: i="<<besti<<" j="<<bestj;
cout<<", Max Sum is "<<sum<<endl;
//#######################################
system("PAUSE");
return 0;
}
#include <iostream>
using namespace std;
#define SIZE 100 //数组大小
//****重载的计算数组长度函数****
int length(int a[]);
int length(char a[]);
//-----------------------------------
//****初始化数组函数******
void InitArray(int a[SIZE][SIZE]);
void InitArray(double a[SIZE][SIZE]);
//-----------------------------------
//****输入数组中数据*****
void Input(char p[]);
void Input(int p[]);
//-----------------------------------
//****打印数组中数据*****
void PrintArray(int a[SIZE][SIZE],int lr,int lc);
//-----------------------------------
//*****矩阵链乘*****
void Matrix_chain_order(double m[20][20],double s[20][20],int p[20]);
void Print_optimal_parens(double s[20][20],int i,int j);
//-----------------------------------
//********LCS********
void LCS_Length(char x[],char y[],int b[SIZE][SIZE],int c[SIZE][SIZE]);
void Print_LCS(int b[SIZE][SIZE],char x[],int i,int j);
//-----------------------------------
//*******Max_Sum******
int BetterMaxSum(int n, int a[], int &besti, int &bestj);
//-----------------------------------
functions.cpp
#include "Functions.h"
//**************************************************************
//----------计算数组a中元素个数,返回元素个数值------------------
int length(int a[])
{
int count=0;
while(a[count]!=0)
count++;
return count;
}
int length(char a[])
{
int count=0;
while(a[count]!='/0')
count++;
return count-1;
}
//--------------------------------------------------------------
//**************************************************************
//--------初始化二维数组a,将其中所有元素值均赋为0--------------
void InitArray(int a[SIZE][SIZE])
{
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
a[i][j]=0;
}
}
}
void InitArray(double a[SIZE][SIZE])
{
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
a[i][j]=0;
}
}
}
//--------------------------------------------------------------
//**************************************************************
//------------------输入数组p中元素-----------------------------
void Input(char p[])
{
cout<<"输入序列:";
gets(p);
//_____________________________
// 将字符数组中所有元素后移一位
//-----------------------------
int pos=0;
while(p[pos]!='/0')
pos++;
p[pos+2]='/0';
while(pos>=0)
{
p[pos+1]=p[pos];
pos--;
}
//------------------------------
}
void Input(int p[])
{
int len;
cout<<"输入序列长度:";
cin>>len;
for(int i=0;i<len;i++)
{
cout<<"输入数据p"<<i<<":";
cin>>p[i];
}
p[len]=0;
}
//--------------------------------------------------------------
//**************************************************************
//--------------------输出数组中元素----------------------------
void PrintArray(int a[SIZE][SIZE],int lr,int lc)
{
for(int i=0;i<lr;i++)
{
for(int j=0;j<lc;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
//--------------------------------------------------------------
//**************************************************************
//-----------------矩阵链乘相关函数实现-------------------------
void Matrix_chain_order(double m[20][20],double s[20][20],int p[20])
{
int n=length(p)-1;
for(int i=1;i<=n;i++)
m[i][i]=0;
for(int l=2;l<=n;l++)
{
for(int i=1;i<=(n-l+1);i++)
{
int j=i+l-1;
m[i][j]=10000000;
for(int k=i;k<=(j-1);k++)
{
int 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;
}
}
}
}
}
void Print_optimal_parens(double s[20][20],int i,int j)
{
if(i==j)
cout<<"A"<<i;
else
{
cout<<"(";
Print_optimal_parens(s,i,s[i][j]);
Print_optimal_parens(s,s[i][j]+1,j);
cout<<")";
}
}
//--------------------------------------------------------------
//**************************************************************
//-------------------LCS相关函数实现----------------------------
void LCS_Length(char x[],char y[],int b[SIZE][SIZE],int c[SIZE][SIZE])
{
int m=length(x);
int n=length(y);
for(int i=1;i<=m;i++)
c[i][0]=0;
for(int j=0;j<=n;j++)
c[0][j]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=2;
}
else
{
if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=3;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=4;
}
}
}
}
}
void Print_LCS(int b[SIZE][SIZE],char x[],int i,int j)
{
if(i==0||j==0)
return;
if(b[i][j]==2)
{
Print_LCS(b,x,i-1,j-1);
cout<<x[i];
}
else
{
if(b[i][j]==3)
Print_LCS(b,x,i-1,j);
else
Print_LCS(b,x,i,j-1);
}
}
//--------------------------------------------------------------
//**************************************************************
//---------------Max-Sum相关函数实现----------------------------
int BetterMaxSum(int n, int a[], int &besti, int &bestj)
{
int sum = 0;
for(int i=1; i <= n; ++i)
{
int thissum = 0;
for(int j=i; j <= n; ++j)
{
thissum += a[j];
if(thissum > sum)
{
sum = thissum;
besti = i, bestj = j;
}
}
}
return sum;
}
//--------------------------------------------------------------
main.cpp
#include "Functions.h"
int main()
{
//######################################
//===========矩阵链乘测试代码=========
/*int p[20];
Input(p);
double m[20][20],s[20][20];
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
m[i][j]=0;
s[i][j]=0;
}
}
Matrix_chain_order(m,s,p);
Print_optimal_parens(s,1,length(p)-1);
*/
//########################################
//#######################################
//=========== LCS测试代码 ============
/*char x[SIZE],y[SIZE];
cout<<"请输入序列1:"<<endl;
Input(x);
cout<<"请输入序列2:"<<endl;
Input(y);
int b[SIZE][SIZE],c[SIZE][SIZE];
InitArray(b);
InitArray(c);
LCS_Length(x,y,b,c);
PrintArray(c,length(x)+1,length(y)+1);
PrintArray(b,length(x)+1,length(y)+1);
Print_LCS(b,x,length(x),length(y));*/
//#######################################
//#######################################
//==========Max-Sum测试代码==========
int a[20];
Input(a);
int besti,bestj;
int sum=BetterMaxSum(length(a),a,besti,bestj);
cout<<"Ans: i="<<besti<<" j="<<bestj;
cout<<", Max Sum is "<<sum<<endl;
//#######################################
system("PAUSE");
return 0;
}
相关文章推荐
- 【经典问题】二维动态规划问题:求最长公共子序列LCS
- 动态规划 字符串最大公共子序列以及最大公共子串问题LCS
- 动态规划5:LCS最长公共子序列问题
- 动态规划解决矩阵链乘问题的java编码实现
- 动态规划解最长公共子序列问题(LCS)C语言加注释
- 动态规划之最长公共子序列(LCS)问题
- 动态规划之LCS问题
- HDU-1003 Max Sum(动态规划,最长字段和问题)
- 动态规划问题--最长公共子序列(LCS)问题--删除一些字符使得剩下的是一个回文子串
- 动态规划:装配线与LCS问题
- HDU-1003 Max Sum(动态规划,最长字段和问题)
- 动态规划解N个矩阵链乘问题
- 白话完全解析动态规划原理及相关问题(二)
- 动态规划_矩阵链连乘问题
- 矩阵链乘法问题(给A1A2A3...An加括号,使之乘法次数最小)动态规划问题C++实现
- 动态规划求解01背包相关的基本问题
- 动态规划解决LCS问题
- 动态规划解决最长公共子序列LCS问题
- 动态规划解决矩阵链相乘问题
- 动态规划2——矩阵链乘问题