动态规划【数塔初始篇之二】(原创)

6033290

还是以数塔为例!刚开始学习,感觉递推与动态规划好像一样,但是动态规划比较难,今天发现一点不同,发上来,仅供参考!

数塔的公式我就不写了,直接代码讨论:

递推的代码:

#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;
}

经过实际代码,我们会发现,递推和动态规划都有一个递推公式,并且含义完全相同,不同之处在于中间变量的纪录,动态规划更加强调的是记录中间过程,并加以保留,再此题,动态规划在没有破坏原始数据的基础之上保留了中间结果。而递推,是在破坏了原始数据的基础上保留了中间结果。感觉递推更像是一种简洁的动态规划!

posted on 2010-02-24 14:12  W_Z_C  阅读(188)  评论(0)    收藏  举报

导航