1、动态规划的递归写法
求解斐波那契数列。
//记忆化搜索
int dp[maxn];
int F(int n)
{
if(n==0||n==1) return 1;
if(dp[n]!=-1) return dp[n];
else
{
dp[n]=F(n-1)+F(n-2);
return dp[n];
}
}
2、动态规划的递推写法
数塔问题。
自下而上。
#include<cstdio>
#include<alrorithm>
using namespace std;
const int maxn=1000;
int f[maxn][maxn]; //每个位置的值
int dp[maxn][maxn]; //从该位置向下的最大值
int main()
{
int n; //一共n行
scanf("%d",&n);
//输入
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&f[i][j]);
}
}
//边界
for(int i=1;i<=n;i++)
{
dp[n][i]=f[n][i];
}
//从第n-1层不断向上计算出dp[i][j]
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+f[i][j];
}
}
printf("%d\n",dp[1][1]);
return 0;
}