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

浙公网安备 33010602011771号