DP动态规划问题(1)

来源:互联网 发布:网络拒绝接入,连接失败 编辑:程序博客网 时间:2024/05/18 20:09
1.数字三角形问题
解题思路:
if (r==N)
    MaxSum(r,j)=D(r,j);
else
       MaxSum(r,j)=Max{MaxSum(r+1,j),MaxSum(r+1,j+1)}+D(r,j);
记忆递归型动归程序:
int D[MAX][MAX]  ;int n;
int maxSum(int i,inj)
{
if (maxSum[i][j]!=-1)
    return maxSum[i][j];
if (i==n) maxSum[i][j]=D[i][j];
else{int x=MaxSum(i+1,j);
int y=MaxSum(i+1,j+1);
maxSum[i][j]=max(x,y)+D[i][j];
}
return maxSum[i][j];
int main ()
{
int i,j;
cin>>n;
for (i=1;i<=n;i++)
for (j+;j<=i;j++){cin>>D;
maxSum[i][j]=-1;
}
cout <<MaxSum(1,1)<<endl;}
人人为我递推型动归解题思路

for (int i=1;i<=n;++i)
maxSum[n][i]=D[n][i];
for (int i=n-1;i>=1;--i)
for(int j=1;j<=i;++j)
maxSum[i][j]=max(maxSum[i+1][j],maxSum[i+1][j+1])+D[i][j];
空间优化(没必要用二维数组来存储可以使用一维数组,甚至可以看maxSum数组都不用
,直接用第n行来代替maxSum主要是为了节省空间,时间复杂度不变)
解题思路:
int *maxSum;
maxSum=D[n];
递归道动归的转化思想:
递归函数有几个参数就定义一个nw维的数组,数组的下表是递归函数残念书的取值范围,
数组元素的元素就是函数的额返回值,如此就可以从边界值开始填充数组
所以动态规划的解题思路就是将原问题分解为子问题,并确定状态和一些初始状态(边界值),
最后确定状态转移方程。因此,动态规划解决的问题具有最优子结构性质以及无后效性。

0 0