动态规划___数学三角形问题
2012-11-01 09:52
337 查看
从文本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;
}
//类里有递归和迭代两种版本
#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;
}
相关文章推荐
- 动态规划0/1背包问题和数字三角形
- 动态规划_数字三角形问题
- Leetcode 120. Triangle 三角形问题(动态规划经典) 解题报告
- 动态规划问题数字三角形的(递归程序)
- 动态规划--数字三角形问题
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- 经典动态规划基础题-三角形最大和问题
- 动态规划 问题之数字三角形(正序递推)
- ACM学习历程—SNNUOJ1213 加油站问题(动态规划 || 数学)
- 经典动态规划问题--数字三角形 POJ--1163
- 动态规划之台阶问题
- UniquePaths,UniquePaths2,路径问题。动态规划。
- 动态规划相关问题源码(包括矩阵链乘、LCS、和max sum)
- 背包问题动态规划详细探究
- 动态规划解最长公共子序列问题LCS(二)
- 动态规划解最长公共子序列问题
- ACM:动态规划,物品无限的背包问题(完全背包问题)
- 动态规划解最长公共子序列问题
- 动态规划--01背包问题
- Problem 2129 子序列个数 (动态规划题目,注意模余的问题)