深度优先,记忆化搜索

深度优先,记忆化搜索

  • 题目:数字金字塔
    • 1.深度优先搜索
    • 2.记忆化搜索<搜过得不在搜>
    • 3.动态规划<自下而上,不断更新>


枚举
深度优先 <记忆化搜索> <回溯>

动态规划





题目:数字金字塔

				7
			3		8
		8		1		0
	2		7		4		4
4		5			2			6	





1.深度优先搜索

int r,a[1005][1005],ans=0; 

int main()
{
	cin>>r;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=i;j++)
			cin>>a[i][j];
	dfs(1,1,0);
	cout<<ans;
 } 
 
 
 void dfs(int h,int l,int s)
 {
 	if(h==r+1)                     //递归出口 
 	{
 		ans=max(ans,s);
 		return;
	 }
 	dfs(h+1,l,s+a[h][l]);
 	dfs(h+1,l+1,s+a[h][l]);        //左右分支递归 
 }









2.记忆化搜索<搜过得不在搜>

int r,a[1005][1005],flag[1005][1005]; 

int main()
{
	memst(flag,-1,sizeof(flag));
	cin>>r;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=i;j++)
			cin>>a[i][j];
			cout<<dfs(1,1);                     // 从此位置到最下面的更优的是多少 
 } 
 
 
 void dfs(int h,int l)
 {
 	if(flag[h][l]!=-1)							// 查询备忘录,已更新值则无需递归 
 		return flag[h][l];
 	if(h==l)
 		flag[h][l]=a[h][l];
 	else
 		flag[h][l]=max(dfs[h+1][l],dfs[h+1][l+1])+a[h][l];
 	
 	return flag[h][l];
 }








3.动态规划<自下而上,不断更新>

int r,a[1005][1005]; 

int main()
{
	cin>>r;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=i;j++)
			cin>>a[i][j];
	for(int i=r-1;i>=1;r--)
	{
		for(int j=1;j<=i;j++)
		{
			a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
		}
	 } 
	 
	 cout<<a[1][1];
 } 

你可能感兴趣的:(算法,深度优先,算法,c++)