#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
#include<queue>
#define maxn 1000
using namespace std;
int n,m;
//动态规划,重叠子问题,数塔,递推写法,开一个dp数组存储子问题的答案,动态规划两个关键重叠子问题,最优子结构,注意和分治和贪心的区别
vector<int>tower[maxn];
vector<int>dp[maxn];
void solve()//递推写法
{
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+tower[i][j];//状态转移方程
}
}
}
int DP(int i,int j)//递归写法,速度较慢且未将子问题结果保存在dp中
{
if(i==n-1){
return dp[i][j];
}
return max(DP(i+1,j),DP(i+1,j+1))+tower[i][j];//结果未保存
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
int temp;
scanf("%d",&temp);
tower[i].push_back(temp);
dp[i].push_back(-1);
}
}
for(int i=0;i<n;i++){
dp[n-1][i]=tower[n-1][i];//边界
}
//solve();
printf("%d\n",DP(0,0));
}
初识动态规划,实践求解数塔问题
最新推荐文章于 2022-10-15 14:18:47 发布