DP问题——数字三角形

这篇博客讨论了一个使用动态规划求解以特定元素为终点的路径上矩阵元素最大和的问题。代码中展示了如何初始化状态并避免使用memset进行错误的初始化。易错点在于当矩阵包含负值时,错误的初始化可能导致答案错误。
摘要由CSDN通过智能技术生成

f[i][j]矩阵表示以a[i[j]为终点的路径和最大值。

状态划分方法为前一步是该节点的左上方节点还是右上方节点。

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510,INF = 1e9;
int a[N][N],n,m,f[N][N];
int main(){
    cin >> n;
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= i;j++)
            cin >> a[i][j];
            
    //memset(f,-1e8,sizeof f);  不能这么初试化,memset按字节初始化的。
    for (int i = 0; i <= n; i ++ )
        for (int j = 0; j <= i + 1; j ++ )
            f[i][j] = -1e8;
            
    f[1][1] = a[1][1];
    
    for(int i = 2;i <= n;i++)
        for(int j = 1;j <= i;j++)
            f[i][j] = max(f[i - 1][j - 1],f[i - 1][j]) + a[i][j];
            
    int res = -1e8;
    
    for(int i = 1;i <= n;i++) {
        res = max(res,f[n][i]);}
    cout << res;
    return 0;
}

易错点:注意f初始化时不能用memset。具体原因是memset以字节为单位初始化。-1e9一个字节表示不完。需要多个字节,导致有些字节为00H。是某些f中的元素初始化为0。当a矩阵中出现负值时会WA。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值