0
点赞
收藏
分享

微信扫一扫

动态规划DP专题

mjjackey 2022-02-23 阅读 72
  • 例题

动态规划五部曲:

定义一个一维数组来记录不同楼层的状态

1.确定dp数组以及下标的含义

dp[i]:爬到i层的方法数

2.根据1确定递推公式

dp[i]=dp[i-1]+dp[i-2]

3.dp数组如何初始化

dp[0]不用管它是几,因为题目说i是正整数;所以初始化dp[1]=1,dp[2]=2,然后从i=3开始递推。

4.确定遍历顺序

从递推公式dp[i]=dp[i-1]+dp[i-2]得知遍历是从前往后。

5.举几个例子推导验证dp数组

代码示例:

#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> dp(n+1);

int main()
{
dp[1]=1;
dp[2]=2;
cin>>n;
for(int i=3; i<=n; i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
cout<<dp[n]<<endl;
}
  • 例题

 

 

 动态规划五部曲:

1.确定dp数组以及下标的含义

dp[m][n]:在一个m行n列的迷宫中走到final的路径数

2.根据1确定递推公式

dp[m][n]=dp[m-1][n]+dp[m][n-1];

3.dp数组初始化

dp[1][2,3,4,5,,,n]=1,dp[2,3,4,5,,,m][1]=1,dp[2][2]=2

4.确定遍历顺序

由递推公式可知:从上到下,从左到右

5.举例验证推导dp数组

#include<iostream>
#include<vector>
using namespace std;
int m,n;
int main()
{
cin>>m>>n;
vector<vector<int> > dp(m,vector<int>(n,0));
//注意这里的<vector<int> >,右边两个>要加空格,否则被认作operator而报错

for(int i=0; i<m; i++)
{
dp[i][0]=1;
}
for(int i=0; i<n; i++)
{
dp[0][i]=1;
}

//这里要是先按从上到下的顺序赋值,就把m和n互换,然后别忘了同时换i和j,因为ij对应的含义发生了改变
for(int i=1; i<m; i++)
{
for(int j=1; j<n; j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}

// for(int i=0; i<m; i++)
// {
// for(int j=0; j<n; j++)
// {
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<dp[m-1][n-1]<<endl;
}

Debug测试用代码:

	for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cout<<dp[i][j]<<" ";
}
cout<<endl;
}

 

 

参考于公众号:代码随想录

举报

相关推荐

0 条评论