动态规划初步-数字三角形
从上往下求和, 求最大和的路径.
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; }