POJ 1163 经典三角形DP重写

/*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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值