初识动态规划,实践求解数塔问题

#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));
}

猜你喜欢

转载自blog.csdn.net/weixin_45890608/article/details/113076488