/*DP的经典入门题,我用三种方法重做一遍
1.递归计算
2.递推计算
3.记忆化搜索
*/
//方法一:
#include <stdio.h>
int a[100][100], N;
int d( int i, int j )
{
return a[i][j] + ( i == N ? 0 : d(i+1, j) > d(i+1, j+1) ? d(i+1, j) : d(i+1, j+1) );
}
int main()
{
int i, j;
scanf( "%d", &N );
for( i = 1; i <= N; i++ )
for( j = 1; j <= i; j++ )
scanf( "%d", &a[i][j] );
printf( "%d\n", d(1, 1) );
return 0;
}
//方法二:
#include <stdio.h>
int d[100][100], a[100][100];
int main()
{
int i,j,N;
scanf( "%d", &N );
for( i = 1; i <= N; i++ )
for( j = 1; j <= i; j++ )
scanf( "%d", &a[i][j] );
/*--------------------------递推数组---------------*/
for( j = 1; j <= N; j++ ) d[N][j] = a[N][j];
for( i = N-1; i >=1; i-- )
for( j = 1; j <= i; j++ )
d[i][j] = a[i][j] + ( d[i+1][j] > d[i+1][j+1] ? d[i+1][j] : d[i+1][j+1] );
printf( "%d\n", d[1][1] );
return 0;
}
//方法三:
#include <stdio.h>
#include <string.h>
int a[100][100];
int num[100][100]; //标记数组,判断是否被搜索
int N;
int d( int i, int j )
{
if( num[i][j] >= 0 ) return num[i][j];
return num[i][j] = a[i][j] + ( i == N ? 0 : d(i+1, j) > d(i+1, j+1) ? d(i+1, j) : d(i+1, j+1) );
// return a = b; C语言中赋值语句是有返回值的,返回a 的值,也就是b
}
int main()
{
int i, j, N;
scanf( "%d", &N );
for( i = 1; i <= N; i++ )
for( j = 1; j <= i; j++ )
scanf( "%d", &a[i][j] );
memset( num, -1, sizeof(num) );
printf( "%d\n", d(1,1) );
return 0;
}