动态规划___数学三角形问题

本文介绍了一种算法,通过递归和迭代方式从文本文件中读取数据,并求解矩阵中最大路径和,最终将结果输出到指定文件。详细阐述了算法的具体实现过程及性能对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从文本input,txt输入  将结果输出到output.txt

//类里有递归和迭代两种版本
#include<iostream>
#include <fstream.h>

#define MIN_NUM -99999
#define max(a, b) (a>b?a:b)

class NumTrigon
{
public:
     NumTrigon(const char* filename)
     {
          m_triSize = 0;
          m_pTrigon = NULL;
          m_MaxSum = 0;
          GetDateFromFile(filename);
          InitMemo();
     }
     void GetDateFromFile(const char* datefile)
     //从文件中读取数据到m_pTrigon
     {
          ifstream readfile(datefile);
          readfile>>m_triSize;
          m_pTrigon = new int*[m_triSize];
          for(int i=0; i<m_triSize; i++)
               m_pTrigon[i] = new int[m_triSize];
          //注意读取顺序为m_pTrigon[j][i]
          for(i=0; i<m_triSize; i++)
               for (int j=0; j<=i; j++)
                    readfile>>m_pTrigon[j][i];
          readfile.close();

     }
     void InitMemo()
     //根据m_triSize的值分配并初始化Memo为最小
     {
          m_pMemo = new int*[m_triSize];
          for(int i=0; i<m_triSize; i++)
               m_pMemo[i] = new int[m_triSize];
          for(i=0; i<m_triSize; i++)
               for(int j=0; j<m_triSize; j++)
                    m_pMemo[i][j] = MIN_NUM;
     }
     int GetMaxSum(int i, int j)
     //递归版
     {
          //判断有无最优解的记录
          if(m_pMemo[i][j] != MIN_NUM)
               return m_pMemo[i][j];
         
          int n = m_pTrigon[i][j];
          //递归终止条件 即列数到了最后
          if(j == m_triSize-1)
          {
               m_pMemo[i][j] = n;
               return n;
          }

          //递归求解 并在返回时记录最优解
          m_pMemo[i][j] = max(n+GetMaxSum(i, j+1), n+GetMaxSum(i+1, j+1));
          return m_pMemo[i][j];
     }
     void CalcuMaxSum()
     {
          m_MaxSum = GetMaxSum(0,0);
     }
     void CalcuMaxSum_Loop()
     //迭代版
     {
          //初始化最底层子问题Memo
          for(int i=0; i<m_triSize; i++)
               m_pMemo[i][m_triSize-1] = m_pTrigon[i][m_triSize-1];

          //逐层向上求解
          for(int j=m_triSize-2; j>=0; j--)
               for (int i=0; i<=j; i++)
                    m_pMemo[i][j] = m_pTrigon[i][j] + max(m_pMemo[i][j+1], m_pMemo[i+1][j+1]);

          m_MaxSum = m_pMemo[0][0];
     }

     void WriteSumToFile(const char* aimfile)
     {
          ofstream writefile(aimfile);
          writefile<<m_MaxSum;
          writefile.close();
     }

     ~NumTrigon()
     {
          for(int i=0; i<m_triSize; i++)
          {
               delete m_pTrigon[i];
               delete m_pMemo[i];
          }
          delete m_pTrigon;
          delete m_pMemo;
         
     }
private:
     int m_triSize;
     int** m_pTrigon;
     int m_MaxSum;
     int** m_pMemo;
};

int main()
{
     NumTrigon test("input.txt");
     test.CalcuMaxSum_Loop();
     test.WriteSumToFile("output.txt");
     return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值