动态规划的三角问题
7
- 问题描述:如下数字三角
3 8
8 1 0
2 7 4 4
4 5 2 6 5
计算出从三角形的顶到低的一条路径,使得路径经过的数字和最大。
- 代码:
/************************************************************************* > File Name: numbre_triangle.c > Author: zhanglp > Mail: 820221185@qq.com > Created Time: 2013年10月31日 星期四 15时37分57秒 ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int trangle_num (int *arr, int n, int i, int *temp) { if (i < 0) return 0; int k = 0; int s1, s2; int rs; int flag[i+1]; memset ((char *)flag, 0, sizeof (flag)); for (k = 0; k <= i; k++) { s1 = arr[i*(i+1)/2+k]+temp[k+1]; s2 = arr[i*(i+1)/2+k]+temp[k]; temp[k] = s1 > s2 ? s1 : s2; if (s1 > s2) flag[k] = 1; } rs = trangle_num (arr, n, i-1, temp); rs = rs + flag[rs]; temp[n-i] = rs; return rs; } int main (void) { int n, i, j; printf ("input row : "); scanf ("%d", &n); int arr[n*(n+1)/2]; int temp[n+2]; memset ((char *)temp, 0, sizeof (temp)); srand ((int)time(NULL)); for (i = 0; i < 15; i++) arr[i] = rand () % 10; trangle_num (arr, n, 4, temp); for (i = 0; i < n; i++) { printf ("%d : ", temp[n-i+1]+1); for (j = 0; j <= i; j++) printf ("%d, ", arr[i*(i+1)/2+j]); printf ("\n"); } printf ("max : %d\n", temp[0]); return EXIT_SUCCESS; } |