动态规划入门

题目:https://www.luogu.com.cn/problem/P1216

核心思想:dp[i][j] = p[i][j]+max(dp[i+1][j], dp[i+1][j+1]);
也就是说当前的价值等于二维数组下一行的价值的最大值再加上当前位置原来的值

简单dp方法:

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    /*创建二维数组*/
    int** p = new int* [n];
    int** dp = new int* [n];
    for (int i = 0; i=0; i--) {
        for (int j = 0; j<=i; j++) {
            dp[i][j] = p[i][j]+max(dp[i+1][j], dp[i+1][j+1]);
        }
    }
    
    /*输出答案*/
    printf("%d\n",dp[0][0]);
    return 0;
}

使用一维空间优化:

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    /*创建二维数组*/
    int** p = new int* [n];
    int* dp = new int [n];
    for (int i = 0; i=0; j--) {
            if (j==0) {
                dp[j] = p[i][j] + dp[j];
            } else {
                dp[j] = p[i][j] + max(dp[j], dp[j-1]);
            }
            
            if (dp[j]>ans) {
                ans = dp[j];
            }
            
        }
        
    }
    
    /*输出答案*/
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(动态规划入门)