每日一题第三题

每日一题第三题

题目地址

思路

这是一道经典的dp模板题,这道题在数据较小的时候是可以用搜索来做的,但是鉴于这道题的数据规模比较大所以还是用dp比较好。
因为需要的是最大路径之和,所以我们可以认为最后一层是已经固定好的,然后从倒数第一层开始依次让每一个元素与它的正下方即右下方中的最大的一个相加,这样结束后最顶层的那个元素就是最大路径之和。

递归的思路

递归的思路就是采取深度优先搜索的方式遍历可能的所有路径然后找出这些路径中路径和最大的

代码如下

#include
using namespace std;
int a[510][510];
int n;
int maxAns=0;
bool check(int r,int c){
    if(r>n||c>r)
        return false;
    return true;
}
void maxSum(int r,int c,int ans){
    //递归出口
    if(r==n){
        ans = ans + a[r][c];
        if(maxAns<ans){
            maxAns = ans;
        }
        return;
    }
    //搜索
    if(check(r,c)){
        ans = ans + a[r][c];
        maxSum(r+1,c,ans);
        maxSum(r+1,c+1,ans);
    }
}
int main(){
   
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>a[i][j];
        }
    }
    maxSum(1,1,0);
    cout<<maxAns;
    return 0;
}

这种方法如果数据在比较小的时候是可以的但是题目的数据是1~500,所以这样做就只有一个结果,那当然就是超时了每日一题第三题_第1张图片
嗯。。。。貌似只过了两个点,所以还是老实用动态规划吧。

代码

#include
using namespace std;
int a[510][510];
 int n;
int ans=0;
void maxSum(){
    for(int i=n-1;i>=1;i--){
        for(int j=1;j<=i;j++){
            a[i][j] = a[i][j]+max(a[i+1][j],a[i+1][j+1]);
        }
    }
}
int main(){
   
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>a[i][j];
        }
    }
    maxSum();
    cout<<a[1][1];
    return 0;
}

每日一题第三题_第2张图片
这样就完美AC了
明天再见了

你可能感兴趣的:(蓝桥杯每日一题,算法,c++,动态规划)