C++编程《第18课 动态规划入门》教学课件.pptxVIP

  • 0
  • 0
  • 约2.68千字
  • 约 27页
  • 2026-03-10 发布于广西
  • 举报

C++编程《第18课 动态规划入门》教学课件.pptx

第18课;学习目标;知识讲授;动态规划法;动态规划是一种处理问题的算法思想,而不是某种算法。动态规划常用来解决一些最优化的问题。这些问题主要有以下特征:

;课堂练习1;数字金字塔;#includebits/stdc++.h

usingnamespacestd;

inta[1001][1001];

intans,n;//ans存储最大值

voiddfs(intx,inty,intsum){//表示到达a[x][y]的值为sum

if(x==n)//对最后一行的所有结果求最大值ans

{

ans=max(sum,ans);

return;

}

dfs(x+1,y,sum+a[x+1][y]);

//到达正下方的值为sum+a[x+1][y]

dfs(x+1,y+1,sum+a[x+1][y+1]);

//到达右下方的值位sum+a[x+1][y+1]

}

;

intmain()

{

cinn;

for(inti=1;i=n;i++)

{

for(intj=1;j=i;j++)

cina[i][j];

}

dfs(1,1,a[1][1]);

coutans;

return0;

};问题建模;#includebits/stdc++.h

usingnamespacestd;

inta[1001][1001];

intdp[1001][1001];

//dp[i][j]表示从第n行出发到达a[i][j]点的最值

intans,n;

intdfs(intx,inty){

if(dp[x][y])returndp[x][y];//如果已经计算过dp[x][y],直接返回

if(x==n)dp[x][y]=a[x][y];//递归边界:第n行元素的值为a[i][j]本身

elsedp[x][y]=max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y];

//递归计算dp[x][y]的值=下、右中的较大值+a[x][y]

returndp[x][y];

};

intmain()

{

cinn;

for(inti=1;i=n;i++)

{

for(intj=1;j=i;j++)

cina[i][j];

}

dfs(1,1);

coutdp[1][1];

return0;

};如何用动态规划处理问题;初始化边界条件;根据状态转移方程推出第4层的值;根据状态转移方程推出第3层的值;根据状态转移方程推出第2层的值;根据状态转移方程推出第1层的值;#includebits/stdc++.h

usingnamespacestd;

inta[1001][1001];

intdp[1001][1001],ans;

//dp[i][j]表示从第n行到a[i][j]的最大值

//dp[i][j]可以由dp[i+1][j],dp[i+1][j+1]的值推出

//dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1])

intmain(){

intn;

cinn;

for(inti=1;i=n;i++){

for(intj=1;j=i;j++)cina[i][j];

}

for(inti=1;i=n;i++){

dp[n][i]=a[n][i];

}

//初始化边界条件;

for(inti=n-1;i=1;i--)

{//从第n-1行开始

for(intj=1;j=i;j++)

{//处理第i行的每一列

dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);

}

}

coutdp[1][1];

return0;

};课堂练习;课堂练习1;#includebits/stdc++.h

usingnamespacestd;

inta[505],dp[505];

//dp[i]表示前i项中包含第i项的最长子序列

//初始状态dp[i]=1;

//dp[i]=max(dp[i],dp[j]+1)

/

文档评论(0)

1亿VIP精品文档

相关文档