1.动态规划概念:
2.动态规划递归写法:
裴波那契数列递归:
int F(int n)
{
if(n==0 || n==1)
return 1;
else
return F(n-1)+F(n-2);
}
引入数组dp
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); //计算F(n)保存在dp中
return dp[n];
}
}
3.动态规划递推写法:
#include<iostream>
using namespace std;
const int maxn=100;
int dp[maxn][maxn],fac[maxn][maxn];
int main()
{
int n;
cin >> n;
for(int i=1; i<=n; i++)
for(int j=1; j<=i; j++)
cin >> fac[i][j];
for(int j=1; j<=n; j++)
dp[n][j]=fac[n][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])+fac[i][j];
}
}
cout << dp[1][1];
}
4.最大连续子序列
#include<iostream>
using namespace std;
const int maxn=100;
int A[maxn],dp[maxn];
int main()
{
int n;
cin >> n;
for(int i=0; i<n; i++)
{
cin >> A[i];
}
dp[0]=A[0];
for(int i=1; i<n; i++)
{
dp[i]=max(A[i],dp[i-1]+A[i]); //这个动态规划也是好理解,虽然是要找到连续的最大子列和,但是我们找到每一位上的最大子列和,还是用状态转移方程来实现,最后在dp数组中找到最大的即可