动态规划初步-数字三角形

从上往下求和, 求最大和的路径.

         1

     3        2

4       10       1

分析: 从下向上求和

附代码和运行结果:

递推计算和递归求和, 它们都会把前一步的计算结果保存下来

int n = 3;
int a[4][4] = {1,0,0,0,3,2,0,0,1,10,1,0,4,3,2,20};
int s[4][4];

void d(int i, int j) {
    for ( int i = n; i >= 0; i-- )
        for (int j = 0; j <=n; j++ )
            s[i][j] = a[i][j] + (i == n ? 0 : (s[i+1][j] > s[i+1][j+1]) ? s[i+1][j] : s[i+1][j+1]);
}

int dfs(int i, int j) {
    if (s[i][j] > 0 ) return s[i][j];
    return    s[i][j] = a[i][j] + (i == n ? 0 : (dfs(i+1,j) > dfs(i+1,j+1)) ? dfs(i+1,j) : dfs(i+1,j+1));
    
}

树(好吧我蛋疼了.....这里面用队列来逐层build和print..这个才更像重点=v=):

typedef struct node {
    int value;
    int sum;
    struct node *left, *right;
}Node;

Node *root;


Node *newNode() {
    Node *n = (Node *)malloc(sizeof(Node));
    n->value = 0;
    n->sum = 0;
    n->left = NULL;
    n->right = NULL;
    return n;
}

void printTree() {
    Node *queue[10000];
    int nullCnt = 0;
    int front = 0, rear = 2;
    queue[0] = root;
    queue[1] = NULL;
    while (nullCnt < 2) {
        Node *sn = queue[front];
        if ( sn == NULL ) { 
            nullCnt++;
            printf("\n");
            queue[rear++] = NULL;
        } else {
            nullCnt = 0;
            printf("(%d,%d) ",sn->value,sn->sum);
            if (sn->left != NULL ) queue[rear++] = sn->left;
            if (sn->right != NULL ) queue[rear++] = sn->right;
        }

        front ++;
    }
}

void addNode(int value) {
    Node *n = newNode();
    n->value = value;
    Node *queue[10000];
    int front = 0, rear = 1;
    queue[0] = root;
    while (front < rear) {
        Node *sn = queue[front];
        if (sn->left == NULL ) {
            sn->left = n; return;
        }
        if (sn->right == NULL ) {
            sn->right = n; return;
        }
        queue[rear++] = sn->left;
        queue[rear++] = sn->right;
        front ++;
    }
}

void buildSum(Node *node) {
    int max = node->value;
    if (node->left != NULL ) {
        buildSum(node->left);
        max = node->left->sum + node->value;
    }
    if (node->right != NULL ) {
        buildSum(node->right);
        int s = node->right->sum + node->value;
        max = s > max? s : max;
    }
    node->sum = max;
}

int main() {
    root = newNode();
    root->value = rand()%50;
    for ( int i = 0; i < 14; i++ ) {
        addNode(rand()%50);
    }
    buildSum(root);
    printTree();

    return 0;
}

 

posted @ 2012-12-13 19:20  tsubasa_wp  阅读(258)  评论(0编辑  收藏  举报