动态规划:
1.写出菲波拉契数列自底向上的非递归动态规划算法或自顶向下的递归动态规划算法(备忘录方法)。
输入:输入一个数字。
输出:输出为Fibonacci数列的值。
示例:输入:5 ,输出:8
自顶向下的递归动态规划算法
#include<iostream>
using namespace std;
int Fib[100]={0};//存储Fibonacci数列的值
int Fibonacci(int n)//自顶向下的递归动态规划算法
{
if(n==0) {Fib[0]=1;return Fib[0];}
if(n==1) {Fib[1]=1;return Fib[1];}
if(Fib[n]!=0){return Fib[n];}
else{Fib[n]=Fibonacci(n-1)+Fibonacci(n-2);return Fib[n];}
}
int main()
{
int n;
cin>>n;
cout<<Fibonacci(n);
system("pause");
return 0;
}
自顶向下的递归动态规划算法
#include<iostream>
using namespace std;
int Fib[100]={0};//存储Fibonacci数列的值
int Fibonacci(int n)//自顶向下的递归动态规划算法
{
Fib[0]=1;
Fib[1]=1;
if(n==0){return Fib[0];}
if(n==1){return Fib[1];}
if(n>=2)
{
for(int i=2;i<=n;i++)
{
Fib[i]=Fib[i-1]+Fib[i-2];
}
}
return Fib[n];
}
int main()
{
int n;
cin>>n;
cout<<Fibonacci(n);
system("pause");
return 0;
}
2. 写出矩阵连乘的自底向上非递归的动态规划算法或自顶向下递归的动态规划算法(备忘录方法)。
输入:先输入矩阵连乘的个数n,然后依次手动输入(不能随机生成!)矩阵的维数pi(数字)。注意,6个矩阵,需输7个维数值。
输出:矩阵连乘的次序,如:((A1(A2A3))((A4A5A6))。
示例:输入:6 30 35 15 5 10 20 25,输出:((A1(A2A3))((A4A5)A6))
自底向上非递归的动态规划算法
#include<iostream>
using namespace std;
int n;//矩阵数
int p[20];//存储矩阵的维数n+1
int m[20][20];//存储最优解m[i][j]从i到j的最优解
int s[20][20];//存储最优划分的位置
void input()
{
cin>>n;
for(int i=0;i<n+1;i++)
{
cin>>p[i];
}
}
void MaxtriChain()//自底向上非递归的动态规划算法
{
for(int r=2;r<=n;r++)//r:区间长度
{
for(int i=1;i<=n-r+1;i++)//i:区间左端点
{
int j=i+r-1;//区间右端点
m[i][j]=m[i][i]+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)
{
if(i==j)
{
cout<<"A"<<i;
return;
}
cout<<"(";
Traceback(i,s[i][j]);
Traceback(s[i][j]+1,j);
cout<<")";
}
int main()
{
input();
MaxtriChain();
cout<<"Best resolution:"<<m[1][n]<<endl;
Traceback(1,n);
system("pause");
return 0;
}
自顶向下递归的动态规划算法
#include<iostream>
using namespace std;
int n;//矩阵数
int p[20];//存储矩阵的维数n+1
int m[20][20];//存储最优解
int s[20][20];//存储最优划分的位置
void input()
{
cin>>n;
for(int i=0;i<n+1;i++)
{
cin>>p[i];
}
}
int MaxtriChain(int i,int j)//自顶向下递归的动态规划算法
{
if(i==j)
{
return 0;
}
if(m[i][j]!=0)
{
return m[i][j];
}
int U=INT_MAX;
for(int k=i;k<j;k++)
{
int q=MaxtriChain(i,k)+MaxtriChain(k+1,j)+p[i-1]*p[k]*p[j];
if(q<U)
{
U=q;
s[i][j]=k;
}
m[i][j]=U;
}
return U;
}
void Traceback(int i,int j)
{
if(i==j)
{
cout<<"A"<<i;
return;
}
cout<<"(";
Traceback(i,s[i][j]);
Traceback(s[i][j]+1,j);
cout<<")";
}
int main()
{
input();
cout<<"Best resolution:"<<MaxtriChain(1,n)<<endl;
Traceback(1,n);
system("pause");
return 0;
}