0
点赞
收藏
分享

微信扫一扫

动态规划DP专题

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

动态规划五部曲:

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

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 条评论