您的位置:首页 > 其它

动态规划——POJ1163数字三角形问题

2013-08-26 09:20 155 查看
#include <iostream>
using namespace std;
const int MaxNum = 100;
int Num[MaxNum + 10][MaxNum + 10];
int MaxSum[MaxNum + 10][MaxNum + 10];
int nMaxSum[MaxNum + 10];
int N;
int main()
{
int i;
int j;
cin >> N;
for(i = 0; i < N; ++i)
{
for(j = 0; j <= i; ++j)
cin >> Num[i][j];
}
/*
//给MaxSum[][]赋初值,赋给最后一行,从下向上计算
for(j = 0; j < N; ++j)
{
MaxSum[N - 1][j] = Num[N - 1][j];
}
//依次存储到各点的最路径和到数组MaxSum[][]
for(i = N - 1; 0 < i; --i)
{
for(j = 0; j <= i; ++j)
{
if(MaxSum[i][j] > MaxSum[i][j + 1] )
{
MaxSum[i - 1][j] = MaxSum[i][j] + Num[i - 1][j];
}else
{
MaxSum[i - 1][j] = MaxSum[i][j + 1] + Num[i - 1][j];
}
}
}*/
//用一维数组存储,节省空间,时间复杂度不变
for(j = 0; j < N; ++j)
{
nMaxSum[j] = Num[N - 1][j];
}
for(i = N - 1; 0 < i; --i)
{
for(j = 0; j <= i; ++j)
{
if(nMaxSum[j] > nMaxSum[j + 1])
{
nMaxSum[j] = nMaxSum[j] + Num[i - 1][j];
}else
{
nMaxSum[j] = nMaxSum[j + 1] + Num[i - 1][j];
}
}
}
cout << nMaxSum[0] << endl;
return 0;
}


由递归转化而来的动态规划:

#include <iostream>
using namespace std;
const int MaxNum = 100;
int Sum[MaxNum + 1];
int main()
{
int i;
int j;
int N;
int nInput;
cin >> N;
cin >> Sum[0];

for(i = 1; i < N; ++i)
{
int nTmp = 0;//用于存储Sum[j - 1]
for(j = 0; j <= i; ++j)
{
cin >> nInput;
if(Sum[j] > nTmp)//用于判断是去Sum[j]还是Sum[j - 1]
{
nTmp = Sum[j];
Sum[j] += nInput;
}else
{
nInput += nTmp;
nTmp = Sum[j];
Sum[j] = nInput;
}
}
}

int nTmpSum = 0;
for(i = 0; i < N; ++i)
{
if(Sum[i] > nTmpSum)
nTmpSum = Sum[i];
}
cout << nTmpSum << endl;
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: