动态规划【数塔初始篇之二】(原创)
还是以数塔为例!刚开始学习,感觉递推与动态规划好像一样,但是动态规划比较难,今天发现一点不同,发上来,仅供参考!
数塔的公式我就不写了,直接代码讨论:
递推的代码:
#include<stdio.h>
#define MAX_LEN 101
#define MAX(x,y) ((x > y) ? x : y )//计算两个数的最大值
int N;
int num[MAX_LEN][MAX_LEN];
int main()
{
int t,i,j;
scanf("%d", &t);
while((t--) && scanf("%d", &N))
{
for(i=0; i<N; i++)
{
for(j=0; j<=i; j++)
{
scanf("%d", &num[i][j]);//将数据读入二维数组
}
}
for(i=N-2; i>=0; i--)//递推,从底向上
{
for(j=0; j<=i; j++)
{
num[i][j] += MAX(num[i+1][j],num[i+1][j+1]);
}
}
printf("%d\n", num[0][0]);
}
return 0;
}
动态规划的代码:
#include<stdio.h>
#define MAX_LEN 101
#define MAX(x,y) ((x > y) ? x : y )//计算两个数的最大值
int N;
int num[MAX_LEN][MAX_LEN];
int num_temp[MAX_LEN][MAX_LEN];
int main()
{
int t,i,j;
scanf("%d", &t);
while((t--) && scanf("%d", &N))
{
for(i=0; i<N; i++)
{
for(j=0; j<=i; j++)
{
scanf("%d", &num[i][j]);//将数据读入二维数组
}
}
for(i=0; i<N; i++)
{
num_temp[N-1][i] = num[N-1][i];
}
for(i=N-2; i>=0; i--)
{
for(j=0; j<=i; j++)
{
num_temp[i][j] = MAX(num_temp[i+1][j],num_temp[i+1][j+1])+num[i][j];
}
}
printf("%d\n", num_temp[0][0]);
}
return 0;
}
经过实际代码,我们会发现,递推和动态规划都有一个递推公式,并且含义完全相同,不同之处在于中间变量的纪录,动态规划更加强调的是记录中间过程,并加以保留,再此题,动态规划在没有破坏原始数据的基础之上保留了中间结果。而递推,是在破坏了原始数据的基础上保留了中间结果。感觉递推更像是一种简洁的动态规划!
转载请显示文章出处!谢谢!
浙公网安备 33010602011771号